内存从32GB升级到64GB后遇性能问题,是否需启用UseCompressedOops?
问题
我将应用的内存从32GB升级到64GB后,发现存在一些性能问题。当前JVM配置如下:java.arg.2=-Xms14g java.arg.3=-Xmx54g
根据Oracle官方文档:
Compressed oops is supported and enabled by default in Java SE 6u23 and later. In Java SE 7, use of compressed oops is the default for 64-bit JVM processes when -Xmx isn't specified and for values of -Xmx less than 32 gigabytes. For JDK 6 before the 6u23 release, use the -XX:+UseCompressedOops flag with the java command to enable the feature.
请问我的应用是否需要手动指定UseCompressedOops参数?
回答
需要手动指定-XX:+UseCompressedOops参数,具体原因如下:
- 依据你提供的Oracle官方文档规则:Java SE 7及Java SE 6u23+的64位JVM,仅在未设置-Xmx或**-Xmx小于32GB**时才默认启用压缩指针。你的配置
-Xmx54g远超32GB阈值,JVM会自动禁用压缩指针。 - 压缩指针禁用后,对象引用会从4字节变为8字节,既会额外占用内存,还会降低CPU缓存命中率,这极有可能是你升级内存后出现性能问题的关键原因。
- 只要你的JVM版本是Java SE 6u23及以上,手动添加
-XX:+UseCompressedOops参数可强制启用压缩指针,不受-Xmx超过32GB的限制。
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

