3回复
4年前
JVM 不同GC回收器的表现差别这么大?
想测试相同代码在不同的垃圾回收器下面的不同表现,所以写了一段代码:
public static void main(String[] args) {
long start = System.currentTimeMillis();
byte[] firstAlloc = new byte[_1M * 4];
System.out.println("first allocation");
byte[] secondAlloc = new byte[_1M * 4];
System.out.println("second allocation");
byte[] thirdAlloc = new byte[_1M * 2];
System.out.println("third allocation");
byte[] fourthdAlloc = new byte[_1M * 4];
System.out.println("fourth allocation");
System.out.println("cost: " + (System.currentTimeMillis() - start));
}
非常简单的代码就是总共分配14M的byte数组,分别2使用2次不同的GC回收器,使用的是jdk1.8 两次的VM参数是和结果分别:
第一次:
-verbose:gc -Xmx20M -Xms20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
第二次:
-verbose:gc -Xmx20M -Xms20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
有几个困惑的点
-
jdk默认是使用Parallel Scanvage + Parallel Old来进行垃圾回收,代码中前3次分配我理解应该会有GC出现,但是实际从结果看4次分配都未出现GC分配失败的日志
-
第二次使用ParNew + CMS来进行回收,从结果看第二次分配的时候就触发了Minor GC,但是Eden区按道理应该有8M空间理应可以分配下的,另外从表现看相同代码CMS比1.8默认的表现差了1倍(cost是20ms), 困惑二是为什么会有这么大的性能差距,如果CMS这么差那设计这个垃圾回收器的意义何在?
3445 阅读