JVM 对象在内存中的存储

对象在内存中的存储

  • 如图1,可以看到一个对象在JVM内存中是如何存储的

图1

对象头(Header)

  • 对象头主要包括MarkWord,class指针,如果是数组还有数组的长度
  • MarkWord:包括对象的hashcode,GC分代年龄,锁状态标识,线程持有的锁,偏向线程ID,如下图
    32位jvm中MarkWord
    64位jvm中MarkWord
  • 如上图所示,我们可以发现对象年龄分代为4bit,最大值也就是1111->15,所以在GC回收的时候,年龄超过15的对象会被加入老年代JVM新生代/老年代
  • 上图锁相关的标识将在后面的锁优化进行展开

实例数据(Instance Data)

  • 对象真正存储的有效数据,各种字段内容

对齐填充(Padding)

  • 不是必然存储,hotspot的自动内存管理要求对象大小必须是8字节的整数倍,而对象头正好是8字节的整数倍,所有实例数据部分如果没有对齐时,就需要通过对齐来自动填充
文章作者: 怀风
文章链接: http://blog.leishunyu.com/2019/01/11/2019-01-11-jvm对象在内存中的存储/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Maple