"UseCompressedOops" JVM标志是用来做什么的?何时应该使用它?

90
< p > HotSpot JVM 标志 -XX:+UseCompressedOops 是什么?何时应该使用它?在 64 位 Java 实例上使用它(与不使用)会产生什么样的性能和内存使用差异?< /p >

1
它可以压缩64位指针。你会看到由于增加的指针大小而减少的内存膨胀,GC时间减少,也许会有一点性能下降。jdk1.6.0_22是最后一个默认关闭此标志的Sun JVM。 - sjr
2
请查看http://blog.juma.me.uk/2008/10/14/32-bit-or-64-bit-jvm-how-about-a-hybrid/。 - Vadzim
1个回答

93

大多数 HotSpot JVM 在过去一年中默认开启了此选项。该选项允许 64 位的 JVM 中引用为 32 位,并且可以接近使用 32 GB 的堆内存(超过 32 位指针能够达到的)。同时,您还可以使用不受限制的离堆内存。这样做可以显著地节省内存并潜在地提高性能。

如果您想使用此选项,建议更新到默认开启它的版本,因为此前可能由于存在错误等原因而未启用。尝试使用 Java 6 update 23 或 Java 7 update 5。

简而言之,请勿手动开启此选项,使用默认开启它的版本即可。


更新:

在 Java 8 中,您可以设置 -XX:ObjectAlignmentInBytes=。如果您的堆大小为 64 GB,则将使用 -XX:ObjectAlignmentInBytes=16 并仍然使用 32 位引用。


我读了这篇文章:https://community.oracle.com/message/10019916,其中提到即使默认情况下启用了该标志,我们也应该手动使用它。有什么想法吗? - vanval
1
@vanval 如果你使用的是 JE cache,那么这是推荐的。因为由于某些原因,它无法确定你是否使用了压缩 oops。顺便说一下,我可以想到几种方法来告诉你这个信息。在我看来,除非你想让 JVM 在未启用时失败,否则不需要在命令行上指定它。例如,在 Java 8 上有一个64 GB堆。 - Peter Lawrey
3
我刚对Win8 x64 i7-4702MQ JDK 8 u40 进行了一些测试,使用7 GB的XMS和XMX,其中有5.4GB由从Access数据库加载的大型树使用。我的观点是:手动指定-XX:+UseCompressedOops标志会导致性能下降20%(生成大树时),并且默认GC将多出1个长时间GC暂停(从3个变为4个)。您可以将其视为性能下降或GC暂停时间增加。无论哪种方式,速度都慢了20%。 - zmirc
3
每个应用程序都有自己的内存和使用配置文件。在我们的情况下,来自32位jvm的桌面应用程序,+UseCompressedOops标志拯救了一天,因为它使内存使用保持足够低,以适合客户旧的4GB机器,并且与32位jvm相比,性能提高了30%。 - Alex Byrth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接