JVM运行时数据区总结以及对形象的内存布局

来源:互联网 发布:聚游网络散人 编辑:程序博客网 时间:2024/06/08 02:34

一,数据区

1)程序计数器,线程私有,也就是一个线程对应一个程序计数器,它的作用是为线程指示指令的地址,唯一没有规定OutOfMemoeyError的区域。

2)java虚拟机栈,线程私有,也就是一个线程对应一个栈,线程在调用方法和执行完方法的时候分别对应入栈和出栈的过程,因为是栈的数据结构,非常适合方法调用这样的后进先出的方式,每一个方法对应一个栈帧,栈帧主要有局部变量区(保存局部变量和参数)和操作数栈(方法执行运算过程的中间结果)。

3)本地方法栈,线程私有,类似于java虚拟机栈,只是这里对应Native方法的调用。

4)java堆:非线程私有,存放对象实例和数组的数据区,-Xms,-Xmx控制最小和最大。

5)方法区:非线程私有,存放类信息,常量,符号引用,静态变量,JIT编译的代码。

当中方法区包括一个叫做运行时常量池的数据区,对应Class文件的常量池,放字面量(字符串和final定义的常量)和符号引用,一般解析出来的直接引用也存放在运行时常量池。

6)直接内存:在堆保存一个地址,地址指向堆外的内存,javaNIO有可能会用到,能显著提升性能。

二,创建对象

1,是否加载:当线程遇到一个new指令的时候,会在运行时常量池查看这个对象所属类是否被加载,如果没有会执行响应的加载,验证,准备等过程,如果加载了就可以跳过这个步骤。
2,分配内存,这里注意线程先是在实现定好的内存上分配,当不够的时候才进行相应的扩展,这是为了多线程分配内存的安全性,还有就是虚拟机根据内存是否连续来分配,例如老年代串行gc和并行gc采用的标记整理算法,内存是连续的,而并发gc是标记清楚gc,内存是不连续的。
3,将分配的内存空间初始化零值。
4,执行紧跟在new指令后面的init指令进行字段的初始化。

三,对象的内存布局

对象包含(运行时数据和类型指针(表示属于哪个类)),对象头,对象数据,对齐填充。
hotspot的对象定位:先冲栈上的reference数据指向堆中的对象,对象的对象头中的类型指针指向方法区中的对象类型数据。


0 0
原创粉丝点击