“一个空的物体占据多少空间?”一个工作了5年的Java程序员,直接懵了。大家好,我是Mic,一名拥有14年经验的Java程序员。我把这道题的文字版整理成了15W字的面试文档,大家可以扫描文末收藏。看下面大师的回答。Master:开启压缩指针后,Object默认会占用12个字节,但是为了避免伪共享问题,JVM会填充8个字节的倍数,所以会把4个字节填充成16个字节的长度。关闭压缩指针后,Object默认会占用16个字节,而16个字节恰好是8的整数倍,所以不需要padding。在HotSpot虚拟机中,一个对象在堆内存中的内存布局用OOP结构来表示,主要分为三部分。对象头,包括Markword、分类器指针、数组长度。markword用于存储对象运行时的相关数据,如hashCode、gcgenerationage等,在64位操作系统中占用8个字节,在32位操作系统中占用4个字节一个字节的长度array只能存在于一个object数组中,占用4个字节的实例数据,存储对象中的字段信息是对齐填充的。Java对象的大小需要按照8字节或者8字节的倍数对齐,避免出现falseShare问题。因此,启用压缩指针时一个空对象占用16个字节,其中Markword占用8个字节,分类器指针占用4个字节,alignmentpadding占用4个字节。综上所述,本题不仅考察JVM基础,更考察求职者对JVM对象内存布局的理解。对内存布局的理解主要是为了帮助我们更好的解决JVM应用中的实际问题。喜欢的朋友记得点赞收藏关注哦!!!版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!
