JDK8中Shenandoah GC性能是否弱于G1?实验存疑求助
实验疑问:G1 GC性能优于Shenandoah GC是否存在实验偏差?
实验配置
镜像与Dockerfile
- Shenandoah GC配置(基于Red Hat UBI8 OpenJDK8运行时镜像):
From registry.access.redhat.com/ubi8/openjdk-8-runtime:latest COPY benchmark-1.0.0.jar /benchmark.jar EXPOSE 8080 ENV JAVA_OPTS="\ -server \ -XX:+UseShenandoahGC \ -Xms1g \ -Xmx1g \ -XX:MetaspaceSize=256m \ -XX:MaxMetaspaceSize=256m \ -verbose:gc \ -XX:+PrintGCDetails \ -XX:ConcGCThreads=2 \ -Xloggc:/home/jboss/gc.log \ -XX:+PrintGCDateStamps \ -XX:+AlwaysPreTouch" ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /benchmark.jar
- G1 GC配置(基于Alpine OpenJDK8镜像):
From java:openjdk-8u111-jre-alpine COPY benchmark-1.0.0.jar /benchmark.jar EXPOSE 8080 ENV JAVA_OPTS="\ -server \ -XX:+UseG1GC \ -Xms1g \ -Xmx1g \ -verbose:gc \ -XX:+PrintGCDetails \ -Xloggc:/gc.log \ -XX:+PrintGCDateStamps \ -XX:+AlwaysPreTouch"
压测参数与应用代码
- 压测工具:JMeter,200个工作线程,持续压测10分钟
- 测试应用代码:
public class GCController { // 模拟应用服务中的常量、缓存及其他对象 private static final int[] CONSTANT = new int[1024 * 1024 * 125]; @GetMapping("/allocate") public void allocate(){ try { // 模拟每个请求分配1M内存 int[] allocate = new int[1024 * 256]; allocate[0] = 1; allocate[2] = 2; }catch (Exception e){ // 忽略异常 } } }
测试环境
测试机器配置:2核CPU、2GB内存、4M带宽,压测期间CPU使用率接近100%
实验结果与疑问
实验结果显示G1 GC的性能优于Shenandoah GC,请问该实验是否存在设计或配置上的问题?
补充参考资料:
- CPU使用率截图
- Shenandoah GC日志
- G1 GC日志
内容的提问来源于stack exchange,提问作者Mangosteen
相关产品推荐
相关产品推荐

