关闭

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

标签: jvm内存虚拟机java对象
258人阅读 评论(0) 收藏 举报
分类:

一,数据区

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:60649次
    • 积分:1426
    • 等级:
    • 排名:千里之外
    • 原创:79篇
    • 转载:35篇
    • 译文:0篇
    • 评论:1条
    最新评论