对象在内存中的存储
- 如图1,可以看到一个对象在JVM内存中是如何存储的
对象头(Header)
- 对象头主要包括MarkWord,class指针,如果是数组还有数组的长度
- MarkWord:包括对象的hashcode,GC分代年龄,锁状态标识,线程持有的锁,偏向线程ID,如下图
- 如上图所示,我们可以发现对象年龄分代为4bit,最大值也就是1111->15,所以在GC回收的时候,年龄超过15的对象会被加入老年代JVM新生代/老年代
- 上图锁相关的标识将在后面的锁优化进行展开
实例数据(Instance Data)
- 对象真正存储的有效数据,各种字段内容
对齐填充(Padding)
- 不是必然存储,hotspot的自动内存管理要求对象大小必须是8字节的整数倍,而对象头正好是8字节的整数倍,所有实例数据部分如果没有对齐时,就需要通过对齐来自动填充