一、JVM 内存模型
二、栈管运行,堆管存储
栈是什么?
栈也叫栈内存,主管java程序的运行,是在线程创建时创建,它的生命周期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就结束,生命周期和线程一致,是线程私有的。基本类型的变量和对象的引用变量都保存在栈中。
栈存储什么?
栈帧中主要保存3类数据
本地变量:输入参数和输出参数以及方法内变量;
栈操作:记录出栈、入栈的操作;
栈帧数据:包括类文件、方法等。
栈的运行原理?
栈中的数据都是以栈帧的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧F1,并被压入栈中,A又调用B方法,于是产生栈帧F2并压入栈中,B方法又调用C方法,于是产生栈帧F3也被压入栈,…
执行完毕后,先弹出F3栈帧,再弹F2栈帧,再弹F1栈帧…
也就是在java程序中每一个方法的调用都会放入栈中,每一个方法的形参,方法内参数,返回值也一并放入栈中,程序开始运行则把mian函数压入栈中,调用其他方法则继续压栈,每一个方法结束都会弹栈,直到main方法弹出栈后,程序结束。
遵循“先进后出,后进先出”原则。
堆内存介绍往下看
三、堆内存
在JDK1.8以后永久区变为元空间,以上是JDK1.7之前的版本,堆内存可以进行优化,GC垃圾回收也存在堆内存,详细介绍看关于垃圾回收的文章。
四、程序计数器(PC Register)
程序计数器就是记录当前线程执行程序的位置,改变计数器的值来确定执行的下一条指令,比如循环、分支、方法跳转、异常处理,线程恢复都是依赖程序计数器来完成。
Java虚拟机多线程是通过线程轮流切换并分配处理器执行时间的方式实现的。为了线程切换能恢复到正确的位置,每条线程都需要一个独立的程序计数器,所以它是线程私有的。
五、本地方法栈
本地接口是为虚拟机使用到的Native 方法服务,因为需要融合不同的语言,比如c/c++等,java在内存中专门开辟了一块区域处理标记为native的代码。在Execution Engin执行时需要先加载native librarys。
六、尾巴
这笔记是根据尚硅谷周阳老师了解到的,还有一些博客上的如有错误欢迎纠正。这是基本熟悉一下JVM的内存模型,下面一篇是关于堆内存的垃圾回收机制的笔记,JVM还有好多东西需要学习。