JDK11发布了,ZGC的相关描述很诱人,体验了一下。
一共测试了三次,分别使用JDK8和JDK11。使用JMeter做压力测试,比较G1和ZGC的差别。
JDK8下的G1
JAVA_OPTS=" -Xms2g -Xmx2g -Xmn1400m -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=60 "
JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=50 -XX:+PrintGCDetails -verbose:gc -Xloggc:./g1-gc.log"
大约测试了半个小时,使用visualvm_142查看CPU和内存使用情况:
GC情况:
可见,G1的性能还是不错的。
一共收集467次。一共耗时2405毫秒,平均每次5.15毫秒。
JDK11下的ZGC(2G内存)
JAVA_OPTS=" -server -Xms2g -Xmx2g -XX:ConcGCThreads=4 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC "
JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:file=gis-gc.txt "
同样使用2G内存,测试半小时。
visualvm_142不支持ZGC,所以,使用JDK11自带的jconsole查看:
一共972次收集,耗时1373毫秒。平均每次1.41毫秒。
JDK11的ZGC(8G内存)
据Oracle的宣传,ZGC特别适合大内存的情况。
于是,增大内存配置,继续测试半小时。
JAVA_OPTS=" -server -Xms8g -Xmx8g -XX:ConcGCThreads=4 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC "
JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:file=gis-gc.txt "
jconsole输出如下:
813次收集,耗时1113毫秒。平均每次1.37毫秒。
测试比较失败,因为虽然配置了8G内存,但是,实际使用的内存很少超过1.5G。
以后试试怎么提升程序使用的内存量。
可以看出来,ZGC的性能相比G1还是提高很多的。
JDK8下的G1和JDK11下的ZGC,CPU利用率基本没差别。
下面贴一段ZGC的收集日志:
[1131.279s][info][gc,start ] GC(502) Garbage Collection (Proactive)
[1131.280s][info][gc,phases ] GC(502) Pause Mark Start 0.719ms
[1131.314s][info][gc,phases ] GC(502) Concurrent Mark 34.151ms
[1131.315s][info][gc,phases ] GC(502) Pause Mark End 0.066ms
[1131.315s][info][gc,phases ] GC(502) Concurrent Process Non-Strong References 0.564ms
[1131.315s][info][gc,phases ] GC(502) Concurrent Reset Relocation Set 0.008ms
[1131.315s][info][gc,phases ] GC(502) Concurrent Destroy Detached Pages 0.001ms
[1131.317s][info][gc,phases ] GC(502) Concurrent Select Relocation Set 1.367ms
[1131.317s][info][gc,phases ] GC(502) Concurrent Prepare Relocation Set 0.030ms
[1131.317s][info][gc,phases ] GC(502) Pause Relocate Start 0.565ms
[1131.319s][info][gc,phases ] GC(502) Concurrent Relocate 1.343ms
[1131.319s][info][gc,load ] GC(502) Load: 6.96/7.15/7.00
[1131.319s][info][gc,mmu ] GC(502) MMU: 2ms/25.6%, 5ms/70.2%, 10ms/85.1%, 20ms/92.1%, 50ms/95.8%, 100ms/97.5%
[1131.319s][info][gc,marking ] GC(502) Mark: 4 stripe(s), 3 proactive flush(es), 1 terminate flush(es), 0 completion(s), 0 continuation(s)
[1131.319s][info][gc,reloc ] GC(502) Relocation: Successful, 7M relocated
[1131.319s][info][gc,nmethod ] GC(502) NMethods: 5130 registered, 1910 unregistered
[1131.319s][info][gc,metaspace] GC(502) Metaspace: 59M used, 59M capacity, 59M committed, 60M reserved
[1131.319s][info][gc,ref ] GC(502) Soft: 6431 encountered, 0 discovered, 0 enqueued
[1131.319s][info][gc,ref ] GC(502) Weak: 4778 encountered, 538 discovered, 0 enqueued
[1131.319s][info][gc,ref ] GC(502) Final: 32 encountered, 7 discovered, 0 enqueued
[1131.319s][info][gc,ref ] GC(502) Phantom: 306 encountered, 238 discovered, 0 enqueued
[1131.319s][info][gc,heap ] GC(502) Mark Start Mark End Relocate Start Relocate End Hig