我正在升级生产硬件,与旧套件相比,我们在新套件上看到了更多的年轻一代 GC。
相同的程序在两台机器上运行(相同的二进制文件)。一个明显的区别(我希望这不会对 JVM 产生影响)是我们升级了 RHEL5 -> RHEL6。
我们的 JVM(Java 64 位 Hotspot 1.6,java -version
两者相同)使用相同的命令行 GC 选项运行:
-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseParallelGC -XX:+UseCompressedOops
还:
-Xmx1024M -Xms1024M -XX:NewSize=512M -XX:SurvivorRatio=2
机器之间的区别在于,新机器的 RAM 大约是原来的两倍(32gb
尽管最大堆没有改变)和更多的内核(24 对 16)。
应用程序本身连接到多个外部进程并执行大量网络操作 - 因此这可能表明存在一些回归、错误配置或不兼容(这就是我们测试的原因......)。我想知道的是:
增加年轻代 GC 的水平是否可能是在更多内核上运行的自然和预期结果,还是我应该关注这种发展?
我们在 JConsole 中确认了 GC 的数量,但这与执行以下操作大致相同:
grep "PSYoungGen" ./log | wc -l
(注-XX:+PrintGC -XX:+PrintGCDetails
)
两个盒子上的完整 GC 看起来差不多。
请注意,这是整个应用程序启动过程中的 GC 数量 - 因此它没有执行“更多工作”。这是相同的工作,需要更多的 GC 运行。
例如,我想知道是否-XX:+UseParallelGC
会导致日志中出现更多条目,因为正在使用更多线程(将年轻一代的集合切割成更小的部分,这意味着更多、更小的集合——不用担心)。