Java 7和8中的32位堆优化

Java 7和8中的32位堆优化,java,jvm,Java,Jvm,如果我错了,请纠正我,但据我所知,从Oracle HotSpot JVM 1.7开始,64位版本的JVM不能再以“32位”模式运行(-d32命令行参数) 我听说,如果JVM进程配置的最大堆小于32Gb,JVM会通过保留32位指针等自动优化内存使用。 对吗?这是否仍然适用于64位Oracle HotSpot JVM? 如果是,如何关闭此行为并禁用32位内存优化 谢谢大家! 除了这里提供的答案之外 64位版本的JVM不能再以“32位”模式运行 64位JVM仅在64位模式下运行 我听说,如果JVM进程

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

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


谢谢大家!

除了这里提供的答案之外

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

64位JVM仅在64位模式下运行

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

当堆小于32GB(GB=giga字节,GB=giga位)时,JVM在Java 6、7和8中默认使用压缩的OOP

JVM使用32位引用,这是实际数据的索引。i、 e.所使用的数字可能经过显著转换,成为实际指针。可以使用Unsafe.getInt()查看此索引

压缩Oops Java 8的默认限制为64 GB,您可以通过更改对象对齐方式将其增加到128 GB,但这样做几乎不值得,因为填充会丢失太多内存

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


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

该功能称为“压缩OOPs”。看看这个帖子:太棒了!谢谢,这看起来能回答我的问题。@MarkoTopolnik我想为你的链接中未涉及的问题提供一个较长的答案。这篇文章至少提出了4个问题,其中有一些误解值得讨论,但我不想把它们都当作评论。@PeterLawrey我想你有权单独重新提出这个问题。当然,我不会介意:)@MarkoTopolnik情况并非总是如此,谢谢你向我指出这一点。他们是如何达到64 GB的限制的?这是否意味着现在默认的对齐方式是16字节?谢谢您的详细回答。我的目的是在具有小堆的笔记本电脑上估计具有大堆的JVM中的内存消耗。