https://juejin.cn/post/6844903817897574407
Java 对象并不只是包含我们在 class 中所定义那部分实例数据,还需要包含虚拟机所需要的一些额外信息以及空填充,即对象头(Header)、实体数据(Instance Data)和对齐填充(Padding)三个部分,如下图所示:
Mark Word 被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。具体不同状态不同复用效果见下图
- 类型指针指向该对象所属的类的 Class 对象,但该字段并不是在所有虚拟机中都是必须的。要看虚拟机如何实现对象的访问方式,这里下一节讨论。
- 另外如果对象是一个数组,对象头中还需要保存数组长度的信息。这样虚拟机才能从对象元数据中确定对象的大小。
静态变量和函数是属于类的,一个类只有一份,它在类加载的时候存进方法区。 函数作为类的元数据也存在方法区(同时会受到即时编译的影响)。 局部变量在方法执行时在栈中进行动态分配的,主要位置是局部变量表。
C++ 中有一本广为流传的书《深入理解 C++ 对象模型》专门讲 C++ 对象模型的,整整写成了一本书。可见相对于 C++ 对象,Java 要容易的多。C++ 中要计算一个对象的大小,直接使用 sizeof 即可。而在 Java 中却不能那么直接,如果想更具体的了解 Java 对象在内存中的大小,请看 一个java对象占多大内存 这篇文章,自己实践下。其实,只要知道了对象在内存中的组成(头、实例数据和填充)、实例数据中各个字段类型的大小,就能轻易算出对象的整体大小。
作者:水目沾链接:https://juejin.cn/post/6844903817897574407来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。