JAVA对象在内存中的布局

image.png

以上是普通对象的内存中的存储布局

MarkWord:主要用来存储对象的三类信息(总共8个字节)

①锁的信息:涉及到锁的升级(记录锁的状态),无锁->偏向锁->轻量级->重量级

②哈希值(hashcode)

③对象的年龄:垃圾回收过程中,对象进入老年代的判断依据之一。(例如 JVM默认分代年龄到15会移动到老年代。就是因为 用来存储对象年龄的空间是4个比特,能表示的最大数即15)

ClassPointer:用来标记该对象属于哪个类(4个字节)

InstanceData:实例数据,具体大小取决于对象里的成员变量的大小,如果没有成员变量,默认大小是0个字节。(0字节)

Padding:对齐位,主要是为了用来对齐位,使整个对象的大小是8的整数倍。

如上所示,markWord+ClassPointer+InstanceData=12个字节。所以为了达到8个倍数16,padding的值会补齐4个字节。

也就是说普通对象,初始的默认大小是16个字节。

验证

image.png

上图中由于PeekObeject对象,没有成员变量所以没有展示InstaceData的字节数。

image.png 当我给PeekObeject增加一个int类型的成员变量,那么InstanceData的值就变成了4, 由于此时markWord+ClassPointer+InstanceData=16,所以不再需要补齐,所以没有Padding

原创文章,作者:睿达君,如若转载,请注明出处:http://zrrd.net.cn/2177.html

发表评论

登录后才能评论
咨询电话
联系电话:0451-81320577

地址:哈尔滨市松北区中小企业总部基地13F

微信咨询
微信咨询
QQ咨询
分享本页
返回顶部