博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象的内存布局
阅读量:5940 次
发布时间:2019-06-19

本文共 1096 字,大约阅读时间需要 3 分钟。

对象内存布局

在Hotspot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头,实例数据,对齐填充。

1.对象头

   1.1 存储对象自身的运行时数据(mark word):哈希码,gc分代年龄。

 1.2 Class指针:通过该指针确定该对象是哪个类的实例。

 在64位系统中,class指针占4B,mark word在开启指针压缩的时候占4B;未开启指针压缩的时候占8B.  在32位系统下,上面两部分各占4B;

 

 

2.实例数据

 默认分配策略:long/double ->  int/float -> short/char -> byte/boolean -> Reference

 如果设置了-XX:FieldsAllocationStyle=0(默认是1),那么引用就会放在最前面:Reference -> long/double ->  int/float -> short/char -> byte/boolean

 结论:分配策略总是按照宽度由大到小的顺序排列,相同宽度的放在一起。

 在有继承关系的对象中,只有一个头部,父类的属性分配到该对象中,这样才能通过父类访问他的属性。如果开启CompactFields,那么,子类中较窄的变量就会插到父列的变量的空隙中。

 [[注]] 静态属性所占的空间通常不计算到对象本身的空间中,以为他的引用是在方法区。

 属性的对齐,例如byte占用一个字节的空间,那么就会填充3字节实现对齐。(32bit系统)

3.对齐填充

Hotspot虚拟机要求java对象起始地址必须是8的整数倍,所有Java对象在内存中将以8字节对齐,也就是对象的总大小必须是8字节的整数倍。

 

对象的访问定位

程序通过栈上的引用来操作堆上的具体对象,访问方式有两种。 

句柄访问方式:java堆中将划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息。

指针访问方式:reference变量中直接存储的就是对象的地址,而java堆对象一部分存储了对象实例数据,另外一部分存储了对象类型数据。

 

 这两种访问对象的方式各有优势,使用句柄访问方式最大好处就是reference中存储的是稳定的句柄地址,在对象移动时只需要改变句柄中的实例数据指针,而reference不需要改变。使用指针访问方式最大好处就是速度快,它节省了一次指针定位的时间开销,就虚拟机而言,它使用的是第二种方式(直接指针访问)。

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/tp123/p/6561172.html

你可能感兴趣的文章
通过数据挖掘组织营销潜力的三个重要途径
查看>>
世界银行拨款2293万美元支持印度并网屋顶太阳能
查看>>
中国电信制定物联网策略:规模市场自主经营 长尾市场集成
查看>>
希捷撤离 硬盘的那些风花雪月记忆
查看>>
人工智能数据中心
查看>>
QA请勿忘初心
查看>>
协作与大数据构建新型打假模式
查看>>
崛起的中国服务器市场迎来旺盛的SPEC测试需求
查看>>
7月17日云栖精选夜读:深度 | 两个案例,掌握AI在大数据领域的前沿应用
查看>>
蚂蚁财富联手百会CRM全面升级金融服务
查看>>
视频转成flv格式
查看>>
英特尔分拆McAfee:31亿美元将多数股权卖给投资公司TPG
查看>>
AWS S3宕机的启发: 云必须分散化
查看>>
零基础学习SVN之(二):CVS与SVN的区别
查看>>
HP Webinspect 10 访问wap的url
查看>>
单元测试Struts2的Action(包含源码)
查看>>
Linux存储入门:简易数据恢复方案--分区和LVM实战
查看>>
客服运营三部曲
查看>>
思科分析引擎助力大型数据中心应用发展
查看>>
7 种常用的排序算法直观感受
查看>>