在 Java 虚拟机(JVM)中,对象头(Object Header)的大小取决于多个因素,包括 JVM 的位数(32 位或 64 位)、是否启用了压缩指针(Compressed Oops)、以及对象的状态(如锁状态)等。以下是详细的分析:
对象头主要由两部分组成:
在 32 位 JVM 中,对象头的典型大小为 8 字节:
在 64 位 JVM 中,如果未启用压缩指针,对象头的典型大小为 16 字节:
在 64 位 JVM 中,如果启用了压缩指针(Compressed Oops),对象头的典型大小为 12 字节:
Mark Word 的内容会根据对象的状态(如无锁、偏向锁、轻量级锁、重量级锁)而变化。以下是 Mark Word 在不同状态下的典型分配:
假设有一个简单的 Java 类:
javaclass MyClass {
int a;
long b;
Object c;
}
在 64 位 JVM 中,如果启用了压缩指针,该对象的内存布局可能如下:
总大小为 36 字节,但由于需要 8 字节对齐,最终对象的大小可能是 40 字节。
对象头的大小在不同情况下会有所不同,主要取决于 JVM 的位数、是否启用压缩指针以及对象的状态。在 32 位 JVM 中,对象头通常为 8 字节;在 64 位 JVM 中,如果未启用压缩指针,对象头为 16 字节;如果启用了压缩指针,对象头为 12 字节。Mark Word 的内容会根据对象的状态而变化,用于存储哈希码、分代年龄、锁状态标志等信息。
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!