对象头Object-Header中的-Mark-Word-在32位和64位系统中有显著区别
目录
对象头(Object Header)中的 Mark Word 在32位和64位系统中有显著区别
对象头(Object Header)中的 Mark Word 在32位和64位系统中有显著区别,尤其是在开启或未开启 指针压缩 (Compressed Oops)时。以下是详细说明:
1. 32位系统与64位系统的Mark Word区别
32位系统
Mark Word 大小 :32位(4字节)
结构 :
- 存储对象的哈希码、锁状态、GC分代年龄等信息。
- 锁状态(如偏向锁、轻量级锁、重量级锁)会占用部分位。
64位系统
Mark Word 大小 :64位(8字节)
结构 :
- 与32位类似,但可存储更多的信息。
- 由于指针长度增加(64位),对象头的大小会显著增大,导致内存开销增加。
2. 开启指针压缩(Compressed Oops)与未开启的区别
指针压缩是JVM在64位系统下的一种优化技术,目的是减少内存占用。
未开启指针压缩
指针大小 :64位(8字节)
对象头大小 :
- Mark Word:8字节
- 类型指针(Klass Pointer):8字节
- 总计:16字节(不包括对齐填充)
特点 :
- 内存占用较大,尤其是小对象(如只有几个字段的对象)会显得浪费。
开启指针压缩
指针大小 :32位(4字节)
对象头大小 :
- Mark Word:8字节
- 类型指针(Klass Pointer):4字节
- 总计:12字节(不包括对齐填充)
特点 :
- 类型指针被压缩为32位,减少了内存占用。
- 压缩后的指针可以表示最大35位的地址空间(32GB堆内存),通过左移3位(乘以8)还原为64位地址。
- 显著减少小对象的内存开销。
3. 指针压缩的适用条件
- 堆内存限制 :通常堆内存小于32GB时,指针压缩才能生效。
- 对齐要求 :JVM要求对象在内存中按8字节对齐,因此即使开启指针压缩,对象头大小仍可能对齐到16字节。
4. 总结
特性 | 32位系统 | 64位系统(未压缩) | 64位系统(压缩) |
---|---|---|---|
Mark Word 大小 | 4字节 | 8字节 | 8字节 |
类型指针大小 | 4字节 | 8字节 | 4字节 |
对象头大小(最小) | 8字节 | 16字节 | 12字节 |
内存占用 | 较小 | 较大 | 较小 |
适用场景 | 小内存应用 | 大内存应用 | 堆内存 < 32GB |
- 32位系统 :对象头较小,但受限于地址空间(最大4GB堆内存)。
- 64位系统(未压缩) :对象头较大,适合大内存应用。
- 64位系统(压缩) :通过压缩类型指针,减少内存占用,适合堆内存小于32GB的场景。
在实际开发中,建议在64位系统上开启指针压缩(默认开启),以减少内存开销并提升性能。