Java 7和8中32位堆优化

5
请纠正我如果我错了,但据我所知,从Oracle HotSpot JVM 1.7开始,64位版本的JVM不能再以“32位”模式运行(-d32命令行参数)。
我听说,在JVM进程配置的最大堆内存小于32GB时,JVM会自动通过保留32位指针等来优化内存使用等。 这是正确的吗?这是否仍适用于64位Oracle HotSpot JVM? 如果是,我该如何关闭此行为并禁用32位内存优化?
谢谢!

2
该功能被称为“压缩OOPs”。请查看此线程:https://dev59.com/V2gu5IYBdhLWcg3w0aOg - Marko Topolnik
太好了!谢谢,看起来回答了我的问题。 - Sergey Shcherbakov
@MarkoTopolnik,我本来想提供更详细的回答来回答那些链接没有涵盖的问题。OP至少提出了4个问题,并且存在一些值得解释的误解,但是我不能把它们全部放在评论中。 - Peter Lawrey
1
@PeterLawrey 我认为您有特权独自重新开放此问题。当然,我不介意 :) - Marko Topolnik
@MarkoTopolnik 这不总是这样的,感谢您向我指出了这一点。 - Peter Lawrey
1个回答

4
除了这里提供的答案
64位JVM不能再以“32位”模式运行。
64位JVM只能以64位模式运行。
如果JVM进程配置的最大堆内存小于32GB,JVM会在Java 6、7和8中默认使用压缩指针。
JVM使用32位引用作为实际数据的索引,即所使用的数字可能需要进行重要转换才能成为实际指针。您可以使用Unsafe.getInt()函数查看此索引。
Compressed Oops Java 8的默认限制为64 GB,您可以通过更改对象对齐方式将其增加到128 GB,但很少值得这样做,因为您将失去太多内存以填充空间。
它适用于Oracle JVM和OpenJDK,您可以使用-XX:-UseCompressedOops关闭它,但我无法想象为什么你会想这样做。

1
他们是如何实现64 GB的限制的?这是否意味着现在默认对齐方式为16字节? - Marko Topolnik
感谢您提供详细的答案。我的目的是在具有大堆内存的JVM上,在小堆内存的笔记本电脑上估算内存消耗。 - Sergey Shcherbakov

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