我为我的应用程序切换到 CMS 收集器,应用程序的吞吐量减少了一半。从 GC 日志中,我看到发生小 GC 的频率很高(周围10 per second
)。我分配了一个堆大小4G
。JVM 默认为年轻代使用非常小的尺寸(小于40MB
)。我想通过增加年轻一代的规模来尝试 CMS。您能否为此指出正确的 JVM 参数。
- 我尝试了 -XX:NewRatio 但 JVM 忽略了这个参数,并且年轻一代的大小没有变化
- 我的java版本是
java version "1.6.0_14"
我为我的应用程序切换到 CMS 收集器,应用程序的吞吐量减少了一半。从 GC 日志中,我看到发生小 GC 的频率很高(周围10 per second
)。我分配了一个堆大小4G
。JVM 默认为年轻代使用非常小的尺寸(小于40MB
)。我想通过增加年轻一代的规模来尝试 CMS。您能否为此指出正确的 JVM 参数。
java version "1.6.0_14"
你是如何设置-XX:NewRatio
的,在哪个 JVM 版本上?
反正。如果您也在设置-XX:MaxNewSize=size
,这是一个功能,或者如果您也在设置-XX:+UseConcMarkSweepGC
这是一个已知的错误,它可以被忽略。
这个对我有用:
默认值(Windows 上的 Java 7 64 位):
java -Xmx4g -Xms4g -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -version java版本“1.7.0_07” Java(TM) SE 运行时环境 (build 1.7.0_07-b10) Java HotSpot(TM) 64 位服务器 VM(内部版本 23.3-b01,混合模式) 堆 par 新一代总计613440K , 已使用 21813K 伊甸园空间 545344K,已使用 4% 来自空间 68096K,已使用 0% 到空间 68096K,0% 已使用 并发 mark-sweep 生成总数3512768K,已使用 0K concurrent-mark-sweep perm gen 总计 21248K,已使用 2084K
现在指定比率参数(大致相同的结果):
java -Xmx4g -Xms4g -XX:+PrintGCDetails -XX:NewRatio=6 -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -version par 新一代总539264K , 使用 19174K 伊甸园空间 479360K,已使用 4% 来自空间 59904K,已使用 0% 到空间 59904K,已使用 0% 并发 mark-sweep 生成总数3595136K,已使用 0K concurrent-mark-sweep perm gen 总计 21248K,已使用 2084K
然后是完全不同的新/旧和伊甸园/幸存者比率:
java -Xmx4g -Xms4g -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -version par 新一代总计1398144K,已使用 27965K 伊甸园空间 699136K,已使用 4% 来自空间 699008K,0% 已使用 到空间 699008K,0% 已使用 并发 mark-sweep 生成总数2097152K,已使用 0K concurrent-mark-sweep perm gen 总计 21248K,已使用 2084K
同样适用于 Java 6 或客户端 VM(只是具有不同的默认值)。