3

我为我的应用程序切换到 CMS 收集器,应用程序的吞吐量减少了一半。从 GC 日志中,我看到发生小 GC 的频率很高(周围10 per second)。我分配了一个堆大小4G。JVM 默认为年轻代使用非常小的尺寸(小于40MB)。我想通过增加年轻一代的规模来尝试 CMS。您能否为此指出正确的 JVM 参数。

  • 我尝试了 -XX:NewRatio 但 JVM 忽略了这个参数,并且年轻一代的大小没有变化
  • 我的java版本是java version "1.6.0_14"
4

2 回答 2

5

你是如何设置-XX:NewRatio的,在哪个 JVM 版本上?

反正。如果您也在设置-XX:MaxNewSize=size,这是一个功能,或者如果您也在设置-XX:+UseConcMarkSweepGC这是一个已知的错误,它可以被忽略。

于 2012-06-15T07:12:27.117 回答
1

这个对我有用:

默认值(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(只是具有不同的默认值)。

于 2012-09-26T00:21:33.923 回答