【问题标题】:What does the UseCompressedOops JVM flag do and when should I use it?UseCompressedOops JVM 标志有什么作用,我应该什么时候使用它?
【发布时间】:2012-06-18 18:03:23
【问题描述】:

HotSpot JVM 标志 -XX:+UseCompressedOops 有什么作用,我应该什么时候使用它?在 64 位 Java 实例上使用它(与不使用它相比)时,我会看到什么样的性能和内存使用差异?

【问题讨论】:

  • 它压缩 64 位指针。您会看到由于指针大小的增加而减少了内存膨胀,花费在 GC 上的时间减少了,性能可能略有下降。 jdk1.6.0_22 是最后一个默认关闭此标志的 Sun JVM。

标签: java memory jvm jvm-hotspot


【解决方案1】:

去年的大多数 HotSpot JVM 都默认启用了它。此选项允许在 64 位 JVM 中使用 32 位的引用并访问接近 32 GB 的堆。 (超过 32 位指针可以)(您也可以拥有几乎无限的堆外内存)。这可以节省大量内存并可能提高性能。

如果您想使用此选项,我建议您更新到默认启用它的版本,因为可能有一个很好的理由,例如错误,为什么以前没有启用它。尝试 Java 6 更新 23 或 Java 7 更新 5。

总之不要开启,使用默认开启的版本。


更新:

在 Java 8 中,您可以选择设置 -XX:ObjectAlignmentInBytes=,事实上,如果您将堆大小设置为 64 GB,它将使用 -XX:ObjectAlignmentInBytes=16,并且仍然使用 32 位引用。

【讨论】:

  • 我读过这篇文章:community.oracle.com/message/10019916,它指出我们应该始终手动使用这个标志,即使它默认启用。有什么想法吗?
  • @vanval 如果您使用的是JE cache,则建议这样做这是因为由于某种原因它无法确定您是否使用了compresses oops。我能想到一些可以告诉你这个顺便说一句的方法。恕我直言,除非您希望 JVM 在未启用时失败,否则您不需要在命令行上指定它。例如你在 Java 8 上有一个 64 GB 的堆。
  • 我刚刚在 7 GB xms 和 xmx 的 Win8 x64 i7-4702MQ JDK 8 u40 上运行了一些测试,在 7 GB 中,5.4 GB 被从 Access db 加载的大树使用。我的观点是:手动指定 -XX:+UseCompressedOops 标志会导致性能下降 20%(生成大树时)和 1 次(从 3 到 4)长时间 GC 暂停(使用默认 GC)。您要么将其视为性能下降,要么将其视为 GC 暂停的增加。无论哪种方式,它都慢了 20%。
  • 每个应用程序都有自己的内存和使用配置文件。在我们的例子中,一个来自 32 位 jvm 的桌面应用程序,+UseCompressedOops 标志节省了一天的时间,因为与 32 位 jvm 相比,它保持了足够低的内存使用量以适应客户端的旧 4 GB 机器,并提高了 30% 的性能。跨度>
猜你喜欢
  • 2014-09-29
  • 1970-01-01
  • 2011-02-21
  • 2012-06-02
  • 2012-02-13
  • 2011-01-18
  • 2011-08-18
  • 2017-03-21
  • 1970-01-01
相关资源
最近更新 更多