【问题标题】:32bit heap optimization in Java 7 and 8Java 7 和 8 中的 32 位堆优化
【发布时间】:2015-01-15 10:35:09
【问题描述】:

如果我错了,请纠正我,但据我了解,从 Oracle HotSpot JVM 1.7 开始,64 位版本的 JVM 不能再以“32 位”模式运行(-d32 命令行参数)。

我听说,如果 JVM 进程配置的最大堆小于 32Gb,JVM 会自动通过保持 32 位指针等来优化内存使用。 那是对的吗?这仍然适用于 64 位 Oracle HotSpot JVM 吗? 如果是,如何关闭此行为并禁用 32 位内存优化?

谢谢!

【问题讨论】:

  • 该功能称为“压缩 OOP”。看看这个线程:stackoverflow.com/questions/11054548/…
  • 太棒了!谢谢,这看起来可以回答我的问题。
  • @MarkoTopolnik 我希望为您的链接未涵盖的问题提供更长的答案。 OP 至少问了 4 个问题,并且有许多值得一提的误解,但我懒得把它们都当作 cmets。
  • @PeterLawrey 我认为您有权单独重新打开此问题。当然,我不会介意:)
  • @MarkoTopolnik 并非总是如此,感谢您向我指出这一点。

标签: java jvm


【解决方案1】:

除了这里提供的答案What does the UseCompressedOops JVM flag do and when should I use it?

64位版本的JVM不能再在“32位”模式下运行

64 位 JVM 只在 64 位模式下运行。

我听说,如果 JVM 进程配置的最大堆小于 32Gb,JVM 会自动通过保持 32 位指针来优化内存使用,

当堆小于 32 GB(GB = giga-bytes,Gb = giga-bits)时,JVM 在 Java 6、7 和 8 中默认使用压缩的 Oops。

JVM 使用 32 位引用,它是实际数据的索引。即使用的数字可能会经过重要的转换才能成为实际的指针。您可以使用 Unsafe.getInt() 查看此索引。

Compressed Oops Java 8 的默认限制是 64 GB,您可以通过更改对象对齐方式将其增加到 128 GB,但这样做很少值得这样做,因为您会因填充而损失太多内存。

这是否仍然适用于 64 位 Oracle HotSpot JVM?如果是,如何关闭此行为并禁用 32 位内存优化?

它适用于 Oracle JVM 和 OpenJDK,您可以使用 -XX:-UseCompressedOops 将其关闭,但我无法想象您为什么要这样做。

【讨论】:

  • 他们是如何达到 64 GB 的限制的?这是否意味着现在默认对齐为 16 个字节?
  • 感谢您的详细回答。我的目的是在具有小堆的笔记本电脑上估计具有大堆的 JVM 中的内存消耗。
猜你喜欢
  • 2011-09-02
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 2022-10-12
相关资源
最近更新 更多