科普文:【支持信创、宣传国产】通过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 |
基础性能对比:
内存管理对比:
多线程性能对比:
网络I/O性能对比:
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),提供更全面的性能调优工具和错误修复。 |
在企业级高并发场景下表现稳定,综合性能可能最优。 |
| 测试用例 | 龙芯JDK 11 | OpenJDK 11 | Oracle JDK 11 |
|--------------------|----------------|-----------------|---------------------|
| 基础算术运算( ms/ops) | 10.23 | 10.51 | 9.80 |
| 字符串连接( ms/ops) | 15.12 | 15.43 | 14.67 |
| 指标 | 龙芯JDK 11 | OpenJDK 11 | Oracle JDK 11 |
|-------------------|-----------------|-----------------|---------------------|
| GC 暂停时间( ms)| 12.4 | 11.9 | 8.5 |
| GC 频率(次/秒) | 45 | 40 | 35 |
| 测试用例 | 龙芯JDK 11 | OpenJDK 11 | Oracle JDK 11 |
|--------------------|----------------|-----------------|---------------------|
| 线程创建时间( ms)| 1.23 | 1.15 | 1.05 |
| 锁竞争( ms/ops**) | 2.45 | 2.35 | 2.10 |
| 测试用例 | 龙芯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(宏基准测试) 的性能测试代码模板,适配三种 JDK 环境(需自行调整参数和依赖)。
适用场景:对比特定方法在三种 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)。
适用场景:模拟高并发请求,测试 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)、错误率。
配置(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 的本地库),通过
多次采样:每次测试至少运行 3 次,取平均值减少波动干扰。
性能排序:
选型建议: