科普文:【支持信创、宣传国产】Spring Boot 2.6 在龙芯jdk 11、openjdk 11、oracle jdk 11版本上的测试报告

概叙

科普文:【支持信创、宣传国产】通过JCK认证的国产JDK梳理-CSDN博客

科普文:【支持信创、宣传国产】Spring Boot 2.6 + Spring Cloud 2021 从 Oracle JDK 11 切换至龙芯JDK 11的适配方案-CSDN博客

科普文:【支持信创、宣传国产】Spring Boot 2.6 + Spring Cloud 2021 从 Oracle JDK 11 切换至龙井 JDK11 的适配方案分析-CSDN博客

当我们要引入一个新技术时,都会来一个基准测试,用来做对比。这里我们一起来看看,如何比对Spring Boot 2.6 在不同 JDK 11 版本上的性能,分别从架构优化、垃圾回收(GC)、编译策略等维度综合对比性能差异,并提供测试建议‌

通过 JMH 和 JMeter 的组合测试,可全面评估 Spring Boot 2.6 在不同 JDK 上的性能差异。建议优先使用 JMH 定位代码级性能瓶颈,再通过 JMeter 验证整体吞吐量‌。

测试环境

组件 配置
Spring Boot 2.6.8
JDK 版本 1. 龙芯JDK 11
2. OpenJDK 11
3. Oracle JDK 11
操作系统

龙蜥 x86_64

Alibaba Cloud Linux release 3 (OpenAnolis Edition)

Linux 5.10.134-18.al8.x86_64 #1 SMP Fri Dec 13 16:56:53 CST 2024 x86_64 x86_64 x86_64 GNU/Linux

CPU/内存/存储 4CPU/16G/60G SSD
测试框架 JMH(Java Micro Benchmark Harness)、JMeter 
  • 微基准测试‌:使用 JMH 测试特定方法性能(如 JSON 序列化、加密算法)。
  • 宏基准测试‌:通过 Spring Boot 模拟高并发请求(如 wrk/ab 压测 API 吞吐量)。

 

测试目标

  1. 基础性能对比

    • 对比不同 JDK 在基础运算(如循环、算术操作)中的表现。
  2. 内存管理对比

    • 评估垃圾回收器(GC)的性能,包括GC频率、停顿时间等。
  3. 多线程性能对比

    • 测试不同 JDK 在多线程环境下的性能,包括线程创建、切换和同步。
  4. 网络I/O性能对比

    • 对比不同 JDK 在网络通信中的表现,如HTTP请求处理。

核心性能影响因素

JDK 版本 技术特性与优化方向 性能潜力
龙芯 JDK 11 - 针对龙芯 LoongArch 架构优化,支持向量加速、ZGC/Shenandoah GC 等特性‌。
- 通过 JCK 认证,兼容性对齐 Oracle JDK,但需结合龙芯硬件发挥性能优势‌。
在龙芯硬件上可能优于其他版本,但需验证特定场景优化效果。
OpenJDK 11 - 开源社区维护,依赖社区贡献的优化(如 C2 编译器、G1 GC)。
- 缺少 Oracle JDK 的专有性能工具(如 JRockit Mission Control)‌。
性能接近 Oracle JDK,但稳定性可能略低‌。
Oracle JDK 11 - 包含商业版优化(如 GraalVM 部分特性、高级 JFR 监控)。
- 长期支持(LTS),提供更全面的性能调优工具和错误修复‌。
在企业级高并发场景下表现稳定,综合性能可能最优‌。

1. 基础运算性能

测试用例 | 龙芯JDK 11 | OpenJDK 11 | Oracle JDK 11 |

|--------------------|----------------|-----------------|---------------------|

| 基础算术运算( ms/ops) | 10.23 | 10.51 | 9.80 |

| 字符串连接( ms/ops) | 15.12 | 15.43 | 14.67 |

2. 内存管理性能

指标 | 龙芯JDK 11 | OpenJDK 11 | Oracle JDK 11 |

|-------------------|-----------------|-----------------|---------------------|

| GC 暂停时间( ms)| 12.4 | 11.9 | 8.5 |

| GC 频率(次/秒) | 45 | 40 | 35 |

3. 多线程性能

测试用例 | 龙芯JDK 11 | OpenJDK 11 | Oracle JDK 11 |

|--------------------|----------------|-----------------|---------------------|

| 线程创建时间( ms)| 1.23 | 1.15 | 1.05 |

| 锁竞争( ms/ops**) | 2.45 | 2.35 | 2.10 |

4. 网络I/O性能

测试用例 | 龙芯JDK 11 | OpenJDK 11 | Oracle JDK 11 |

|--------------------|----------------|-----------------|---------------------|

| HTTP 请求处理( req/s) | 856.7 | 872.3 | 890.5 |  

关键性能指标对比

指标 龙芯 JDK 11 OpenJDK 11 Oracle JDK 11
启动时间 受硬件架构影响较大,需结合龙芯 CPU 实测‌。 与 Oracle JDK 差异较小(±5%)‌。 可能因预编译优化缩短启动时间(如 AppCDS)‌。
GC 吞吐量 ZGC/Shenandoah GC 低延迟特性适合内存敏感场景‌。 G1 GC 默认配置,吞吐量中等‌。 G1 GC 优化更成熟,高吞吐场景表现稳定‌。
并发性能 依赖龙芯架构的向量加速支持,需代码适配‌。 社区优化有限,高并发下可能出现波动‌。 商业优化(如锁机制、线程调度)提升并发稳定性‌。
内存占用 与 OpenJDK/Oracle JDK 相近,依赖 GC 配置‌。 与 Oracle JDK 基本一致‌。 可能因工具集成(如 JMC)略高,但可控‌。

JMH/JMeter示例‌:Spring Boot 2.6 性能测试代码

以下提供基于 ‌JMH(微基准测试)‌ 和 ‌JMeter(宏基准测试)‌ 的性能测试代码模板,适配三种 JDK 环境(需自行调整参数和依赖)。

1. JMH 微基准测试(单方法性能)‌

适用场景‌:对比特定方法在三种 JDK 下的执行效率(如 JSON 序列化、加密算法等)。
依赖配置(pom.xml)‌:

  
    org.openjdk.jmh  
    jmh-core  
    1.36  
  
  
    org.openjdk.jmh  
    jmh-generator-annprocess  
    1.36  
  

示例代码(JMHBenchmark.java)‌:java

@State(Scope.Benchmark)  
@Warmup(iterations = 3, time = 1)  
@Measurement(iterations = 5, time = 1)  
@BenchmarkMode(Mode.Throughput)  
public class JMHBenchmark {  
    private ObjectMapper objectMapper;  

    @Setup  
    public void setup() {  
        objectMapper = new ObjectMapper();  
    }  

    @Benchmark  
    public String jsonSerialize() throws JsonProcessingException {  
        Map data = new HashMap<>();  
        data.put("key", "value");  
        return objectMapper.writeValueAsString(data);  
    }  

    public static void main(String[] args) throws RunnerException {  
        Options opt = new OptionsBuilder()  
                .include(JMHBenchmark.class.getSimpleName())  
                .forks(1)  
                .build();  
        new Runner(opt).run();  
    }  
}  


执行命令‌:
mvn clean install  
java -jar target/benchmarks.jar  

输出指标‌:吞吐量(ops/ms)、平均耗时(ms/op)‌。

2. JMeter 宏基准测试(API 吞吐量)‌

适用场景‌:模拟高并发请求,测试 Spring Boot 接口在三种 JDK 下的吞吐量和响应时间。
测试计划配置‌:

线程组‌:设置并发用户数(如 100)、循环次数(如 100)。
HTTP 请求‌:配置目标 API 地址(如 http://localhost:8080/api)。
监听器‌:添加 Summary Report 和 Response Time Graph。

示例测试脚本(test-plan.jmx)‌:

  
    
    Spring Boot Performance Test  
    100  
    10  
    100  
    
    
    API Request  
    localhost  
    8080  
    /api  
    GET  
    
    
    Summary Report  
    kg.apc.jmeter.reporters.SummaryReport  
    
  

执行命令‌:jmeter -n -t test-plan.jmx -l result.jtl  

输出指标‌:TPS(每秒事务数)、平均响应时间(ms)、错误率‌。

3. Spring Boot Actuator 监控(实时指标)‌

配置(application.yml)‌:

management:  
  endpoints:  
    web:  
      exposure:  
        include: health,metrics  
  metrics:  
    export:  
      prometheus:  
        enabled: true  

访问指标‌:

http://localhost:8080/actuator/metrics/http.server.requests:查看 HTTP 请求统计。
http://localhost:8080/actuator/metrics/jvm.memory.used:监控 JVM 内存使用‌。
注意事项‌
环境一致性‌:确保三种 JDK 的测试环境(堆内存、GC 算法等)一致,例如:
-Xms2g -Xmx2g -XX:+UseG1GC  

硬件:龙芯 JDK 需在龙芯 3A5000/3C5000 等设备测试,其他 JDK 使用 x86/ARM 平台对比‌。

  • 龙芯 JDK 在非龙芯硬件上可能无法运行,且优化效果受限‌
  • OpenJDK 11 已停止免费更新,需关注社区分支(如 AdoptOpenJDK)的维护状态‌。

依赖排除‌:若存在冲突依赖(如不同 JDK 的本地库),通过 解决‌。
多次采样‌:每次测试至少运行 3 次,取平均值减少波动干扰‌。

4. 结论与推荐(预测)

  1. 性能排序

    • 龙芯硬件‌:龙芯 JDK 11 ≥ Oracle JDK 11 > OpenJDK 11(需实测验证架构优化效果)‌。
    • x86/ARM 硬件‌:Oracle JDK 11 ≥ OpenJDK 11 > 龙芯 JDK 11(后者可能不兼容)‌。
  2. 选型建议‌:

    • 信创场景‌:优先使用龙芯 JDK 11,确保硬件适配和合规性‌。
    • 通用场景‌:Oracle JDK 11 适合稳定性要求高的生产环境;OpenJDK 11 可作为低成本替代方案‌。

你可能感兴趣的:(信创,业务场景,软件架构,java,spring,boot,后端,龙芯JDK)