“一个空 Object 对象的占多大空间?”
一个工作了 5 年的 Java 程序员间接被搞蒙了。
大家好,我是 Mic,一个工作了 14 年的 Java 程序员。
我把这个问题的文字版本整顿到了 15W 字的面试文档里,大家能够扫描文章尾端支付。
上面看看高手的答复。
高手:
在开启了压缩指针的状况下,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 利用上的理论问题
喜爱的敌人记得点赞珍藏加关注!!!
版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自
Mic 带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!