紧凑对象头(Compact Object Headers)使得 JVM 中对象头的大小,从目前的 96 或 128 比特,减少到在 64 位平台上的 64 比特。
在使用紧凑对象头之前,JVM 中对象头的布局被划分成 mark word 和 class word。
mark word 的尺寸与机器地址相同。以下是 mark word 中不同比特位的使用情况。

class word 的尺寸是 32 或 64 比特,取决于是否启用了类指针的压缩。如果启用了类指针的压缩,尺寸是 32 比特,否则是 64 比特。
以下是未压缩的类指针。

以下是压缩的类指针。

类指针的压缩,默认是启用的。
当使用紧凑对象头时,原始的 mark word 和 class word 被组合在一个 64 比特的结构中。类指针的压缩必须被启用,并且压缩之后的类指针的尺寸从 32 比特减少到 22 比特。不同比特位的分配如下所示。

通过命令行参数 -XX:+UseCompactObjectHeaders 来启用紧凑对象头。
紧凑对象头的启用很简单。对于大多数应用来说,建议启用紧凑对象头。已经有很多的试验可以证明,启用紧凑对象头可以提升应用的性能,包括减少 heap 的使用,减少 CPU 时间,和减少 GC 的次数。当然了,每个应用的实际情况各有不同。在启用了紧凑对象头之后,应该进行更多的测试,以免对应用的运行产生影响。
紧凑对象头在 Java 24 中以试验性功能的形式引入。从 Java 24 开始,紧凑对象头这个功能在生产环境上得到了验证,证明了该功能的稳定性,也确实可以提升系统的性能。亚马逊在生产环境上的几百个服务上启用了该功能,只不过把该功能迁移到 Java 21 和 Java 17。
8万+

被折叠的 条评论
为什么被折叠?



