NewRatio参数在使用CMS垃圾收集器时无效。

3

我将我的应用程序切换到CMS收集器后,应用程序的吞吐量减少了一半。从GC日志中,我看到高频率的minor GC发生(大约每秒10次)。我已经分配了4G的堆大小。JVM默认使用非常小的young gen大小(小于40MB)。我想通过增加young gen的大小来尝试CMS。您能否指点我正确的JVM参数。

  • 我尝试过-XX:NewRatio,但JVM忽略了该参数,并且young gen大小没有变化
  • 我的Java版本是“java version”1.6.0_14“

你正在使用哪个版本的Java?你可以尝试一下Java 6更新33吗? - Peter Lawrey
2个回答

5

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

无论如何,如果你也设置了-XX:MaxNewSize=size这个特性,或者你也设置了-XX:+UseConcMarkSweepGC,那么它可以被忽略,后者是一个已知的bug


非常感谢。这正是我的情况。我在java version "1.6.0_14"上同时使用了-XX:+UseConcMarkSweepGC-XX:NewRatio。我想我会升级我的JVM并尝试一下。 - MoveFast

1

对我来说它是有效的:

默认设置(Java 7 64位Windows):

java -Xmx4g -Xms4g -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -version
java版本 "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)
堆
 并行新生代   总共 613440K,已使用21813K
  eden空间 545344K,使用4%
  from空间 68096K,使用0%
  to空间 68096K,使用0%
 并发标记-清除老年代总共 3512768K,已使用0K
 并发标记-清除永久代总共21248K,已使用2084K

现在指定比例参数(大致相同的结果):

java -Xmx4g -Xms4g -XX:+PrintGCDetails -XX:NewRatio=2 -XX:SurvivorRatio=4 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -version 新生代总大小为539264K,已使用19174K Eden区大小为479360K,已使用4% From区大小为59904K,已使用0% To区大小为59904K,已使用0% 老年代总大小为3595136K,已使用0K 并发标记-清除(CMS)的永久代总大小为21248K,已使用2084K

然后是完全不同的新/旧和伊甸/幸存者比例:

java -Xmx4g -Xms4g -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -version 新生代总共1398144K,已使用27965K Eden区占用699136K,使用率为4% From区占用699008K,使用率为0% To区占用699008K,使用率为0% 并发标记-清除算法的老年代总共2097152K,已使用0K 并发标记-清除算法的永久代总共21248K,已使用2084K

对于Java 6或客户端VM,同样适用(只是默认值不同)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接