以上是普通对象的内存中的存储布局
MarkWord:主要用来存储对象的三类信息(总共8个字节)
①锁的信息:涉及到锁的升级(记录锁的状态),无锁->偏向锁->轻量级->重量级
②哈希值(hashcode)
③对象的年龄:垃圾回收过程中,对象进入老年代的判断依据之一。(例如 JVM默认分代年龄到15会移动到老年代。就是因为 用来存储对象年龄的空间是4个比特,能表示的最大数即15)
ClassPointer:用来标记该对象属于哪个类(4个字节)
InstanceData:实例数据,具体大小取决于对象里的成员变量的大小,如果没有成员变量,默认大小是0个字节。(0字节)
Padding:对齐位,主要是为了用来对齐位,使整个对象的大小是8的整数倍。
如上所示,markWord+ClassPointer+InstanceData=12个字节。所以为了达到8个倍数16,padding的值会补齐4个字节。
也就是说普通对象,初始的默认大小是16个字节。
验证:
上图中由于PeekObeject对象,没有成员变量所以没有展示InstaceData的字节数。
当我给PeekObeject增加一个int类型的成员变量,那么InstanceData的值就变成了4,
由于此时markWord+ClassPointer+InstanceData=16,所以不再需要补齐,所以没有Padding
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END