UseCompressedOops JVM标志做什么以及何时应该使用它?

noa*_*hlz 78 java memory jvm jvm-hotspot

热点JVM标志-XX:+UseCompressedOops做什么以及何时应该使用它?在64位Java实例上使用它时(不使用它),我会看到什么样的性能和内存使用差异?

Pet*_*rey 82

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

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

简而言之,不要打开它,使用默认启用它的版本.


更新:

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

  • 我刚刚在Win8 x64 i7-4702MQ JDK 8 u40上运行了一些测试,其中7 GB xms和xmx,7 GB,5.4 GB由从Access数据库加载的大树使用.我的观点是:手动指定-XX:+ UseCompressedOops标志导致性能下降20%(生成大树时)和另外1个(从3到4)长GC暂停(使用默认GC).您可以将其视为性能下降或GC暂停时间的增加.无论哪种方式,它都慢了20%. (3认同)
  • 每个应用程序都有自己的内存和使用情况。在我们的例子中,一个来自 32 位 jvm 的桌面应用程序,+UsecompressedOops 标志挽救了这一局面,因为与 32 位 jvm 相比,它使内存使用量保持在足够低的水平,足以适合客户端的旧 4GB 机器,并且性能提高了 30%。 (3认同)