我将我的应用程序切换到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“
我将我的应用程序切换到CMS收集器后,应用程序的吞吐量减少了一半。从GC日志中,我看到高频率的minor GC发生(大约每秒10次)。我已经分配了4G的堆大小。JVM默认使用非常小的young gen大小(小于40MB)。我想通过增加young gen的大小来尝试CMS。您能否指点我正确的JVM参数。
你是如何设置-XX:NewRatio
的,使用的JVM版本是哪个?
无论如何,如果你也设置了-XX:MaxNewSize=size
这个特性,或者你也设置了-XX:+UseConcMarkSweepGC
,那么它可以被忽略,后者是一个已知的bug。
java version "1.6.0_14"
上同时使用了-XX:+UseConcMarkSweepGC
和-XX:NewRatio
。我想我会升级我的JVM并尝试一下。 - MoveFast对我来说它是有效的:
默认设置(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,同样适用(只是默认值不同)。