1.程序计数器
程序计数器(program Counter Register) 占据较小的内存,存放下一条指令所在单元地址.在虚拟机的概念模型里,字节码解释器(把目标代码(字节码)转变成具体平台的机器码)通过改变程序计数器的值,来选取下一条需要执行的字节码指令.
java虚拟机的多线程是通过轮流切换并且分配处理器时间的方式来实现的,为了线程切换后恢复到正确的执行位置,每个线程都有一个独立的程序计数器,互不干扰,独立存储,是线程私有的.
如果线程正在执行的是一个java方法,这个计数器记录的是正在执行的字节码指令的地址. 如果执行的是本地方法,计数器为空.
此外这片内存是唯一没有规定任何OutOfMemeoryError情况的区域.
2.java虚拟机栈
java虚拟机栈(java virtual Machine Stacks)跟程序计数器一样,也是线程私有的,它的生命周期与线程生命周期相同.
虚拟机栈描述的是Java方法执行的内存模型, 一个方法被执行的时候,同时会创建一个栈帧, 栈帧存放了局部变量表,操作栈,动态链接,方法出口等信息.每一个方法被调用到执行完的过程,就是一个栈帧从虚拟机栈中入栈到出栈的过程.局部变量表存放了局部变量信息,方法参数.局部变量内存大小在编译期就完成分配.
初学者重点牢记虚拟机栈(局部变量表)中存放对象引用.
3.本地方法栈
与虚拟机栈发挥的作用类似,但虚拟机栈服务于java方法(字节码)服务,但本地方法栈为Native方法服务.
4.java堆
java堆(java Heap) 是虚拟机管理内存中最大的一块,也是线程共享的一块,所有的对象实例以及数组在这里分配内存. 另外堆也是垃圾收集器管理的主要区域.
5.方法区
5.1方法区
方法区和java堆一样,线程共享的区域,存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据.
5.2 运行时常量池
运行时常量池是方法区的一部分,存放着 编译时期生成的各种字面量(例如 int i=2, 2就是字面量)和符号引用.
6.实例
定义一个demo方法
public void demo(){
Object obj=new Object();
}
"new Object()"这部分就在java堆中,存储了Object类型的实例,"Object object"这部分就在java虚拟机栈中存储了Object类型的引用,
简单图表示.(这只是个简示图,对象的访问方式并不是仅如图所示,有兴趣可以查阅资料)
本人
才疏学浅,有错误麻烦指出,本文仅供参考,请友好交流,谢谢!