美文网首页
每日一题 2020-03-24 Java对象的结构是什么样的?一

每日一题 2020-03-24 Java对象的结构是什么样的?一

作者: NoelleMu | 来源:发表于2020-03-25 15:10 被阅读0次

Object obj = new Object(); 是我们都会写的Java代码,但是你知道它执行之后,在不考虑对象引用所占空间的情况下,这个obj对象占用了多少内存空间吗?

这其实是一个面试必问的问题,与之类似的问题是“一个Java对象由几部分组成?”。答案是16字节,4或5个部分。那为什么是16字节呢?要回答这个问题,就要先搞清楚Java对象的结构。

一个Java对象由4部分组成,分别是markword(对象运行时的数据),klass指针(指向该类的元数据,用来说明这个对象属于哪个类),instance data(对象的各种字段内容),padding(占位符),数组还要多一个组成部分是数组长度。其中markword和klass指针,还有数组长度合称对象头。在64位JVM开启指针压缩的情况下,markword占8字节,klass指针占4字节,数组长度占8字节,由于JVM规定对象的起始地址必须是8字节的整数倍,所以padding起占位符的作用,将对象的长度填充到8字节的整数倍,是可以有也可以没有的。

综上所述,Object obj = new Object()申请出来的obj对象占用16个字节:8字节的markword,4字节的klass指针,没有instance data,加起来12字节,所以还有4字节的padding。如果不开启指针压缩,klass指针就是8个字节,该对象也是16个字节。

图1是Java对象的结构图,图2是数组的结构图,两者的不同在于数组多一个长度为8位的数组长度属性。

注:静态属性不计算在对象大小中。

图1 Java对象结构图 图2 Java数组结构图

相关文章

网友评论

      本文标题:每日一题 2020-03-24 Java对象的结构是什么样的?一

      本文链接:https://www.haomeiwen.com/subject/wqtxuhtx.html