「Java面试」一个空Object对象的占多大空间?这道题你答的上来吗

“一个空Object对象的占多大空间?”

一个工作了5年的Java程序员直接被搞蒙了。

我把这个问题的高手回答文字版本整理到了15W字的面试文档里,大家可以私信我发送【Mic】领取。

下面看看高手的回答。

高手:

在开启了压缩指针的情况下,Object默认会占用12个字节,但是为了避免伪共享问题,JVM会按照8个字节的倍数进行填充,所以会填充4个字节变成16个字节长度。

在关闭压缩指针的情况下,Object默认会占用16个字节,16个字节正好是8的整数倍,因此不需要填充。

在HotSpot 虚拟机里面,一个对象在堆内存里面的内存布局是使用OOP结构来表示的,它主要分为三个部分。

  • 对象头,包括Markword、类元指针、数组长度其中Markword用来存储对象运行时的相关数据,比如hashCode、gc分代年龄等。在64位操作系统中占8个字节,32位操作系统中占4个字节类元指针指向当前实例对象所属哪个类,开启指针压缩的情况下占4个字节,未开启则占8个字节数组长度只有对象数组才会存在,占4个字节
  • 实例数据,存储对象中的字段信息
  • 对齐填充,Java对象的大小需要按照8个字节或者8个字节的倍数对齐,避免伪共享问题。

因此,一个空的对象,在开启压缩指针的情况下,占16个字节其中Markword占8个字节、类元指针占4个字节, 对齐填充占4个字节。


总结

这个问题不仅仅考察JVM基础还考察求职者对于JVM对于对象内存布局的理解程度。

对于内存布局这块的理解主要还是帮助我们更好的解决JVM应用上的实际问题。

喜欢的朋友记得点赞收藏加关注!

需要高手面试文档(附赠大厂内部十万字面试文档)或者有不懂的技术面试题想咨询的小伙伴可以后台私信【Mic】或者评论区留言。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章