1. 概述
Java 10 虽然作为一个短期支持版本(仅支持6个月),但它引入了几项开箱即用的性能优化,无需修改任何业务代码即可生效。这些改进对所有运行在 JDK 10 上的应用都有效,尤其在启动速度、GC 停顿和内存使用方面有明显提升。
本文将带你快速掌握 Java 10 中最值得关注的几项性能增强特性,帮你判断是否值得在特定场景下尝试升级。
2. G1 垃圾回收器的并行 Full GC
在 JDK 9 中,G1 成为默认垃圾回收器 ✅。但有个“踩坑点”:Full GC 依然是单线程执行的标记-清除-压缩(mark-sweep-compact)过程,一旦触发,整个应用会陷入长时间的“Stop-The-World”状态,对延迟敏感服务非常不友好。
⚠️ Java 10 修复了这一短板:G1 的 Full GC 现在采用并行处理机制,充分利用多核 CPU 资源,显著缩短停顿时间。
这意味着:
- 即使在极端内存压力下触发 Full GC,应用的暂停时间也更可控
- 对于大堆(large heap)应用,收益更明显
- 无需任何配置变更,升级 JDK 10 后自动生效
🔍 小贴士:虽然并行化改善了停顿,但还是要尽量避免 Full GC。合理设置堆大小、避免内存泄漏仍是关键。
3. 应用类数据共享(AppCDS)
类数据共享(Class-Data Sharing, CDS)早在 JDK 5 就已存在,但早期版本仅支持启动类加载器(bootstrap class loader)加载的系统类,无法作用于应用自己的类 ❌。
Java 10 引入了 Application CDS(AppCDS),扩展了 CDS 的能力,支持以下类加载器:
- 系统类加载器(app class loader)
- 平台类加载器(platform class loader)
- 自定义类加载器(部分支持)
✅ 这意味着:你的应用类也可以被预处理并共享到归档文件中,从而带来两大好处:
- 加快应用启动速度
- 多个 JVM 实例间共享类数据,降低整体内存占用
如何使用 AppCDS?
整个流程分三步走,简单粗暴:
✅ 步骤 1:生成类列表
运行应用,记录所有被加载的类,输出到文件:
$ java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst \
-cp hello.jar HelloWorld
示例说明:
HelloWorld
是主类,hello.jar
是应用 jar 包,hello.lst
将保存类列表。
✅ 步骤 2:创建共享归档文件
基于类列表生成 .jsa
(Java Shared Archive)文件:
$ java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst \
-XX:SharedArchiveFile=hello.jsa -cp hello.jar
⚠️ 注意:此步骤必须在目标运行环境中执行,确保类路径一致。
✅ 步骤 3:启用共享归档启动应用
后续启动直接使用 .jsa
文件,提升效率:
$ java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa \
-cp hello.jar HelloWorld
重要提示
- AppCDS 在 Oracle JDK 8/9 中是商业特性 ❌
- 从 JDK 10 开始,AppCDS 已开源并免费提供 ✅,所有用户均可使用
📌 实际效果:微服务启动时间可缩短 10%~20%,JVM 内存 footprint 下降明显,尤其适合容器化部署场景。
4. 实验性基于 Java 的 JIT 编译器(Graal)
HotSpot JVM 长期以来使用 C++ 编写的 C1/C2 编译器进行即时编译(JIT)。Java 10 引入了一个令人兴奋的实验性功能:支持使用 Graal 作为 JIT 编译器。
什么是 Graal?
- Graal 是一个用 Java 编写的高性能动态编译器
- 它集成在 HotSpot 中,通过 JVM Compiler Interface (JVMCI) 与运行时交互
- 同时也是 JDK 9 中实验性 AOT 编译器(
jaotc
)的基础
如何启用 Graal JIT?
在启动时添加以下 JVM 参数:
-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
示例:
$ java -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler \ -cp hello.jar HelloWorld
注意事项 ⚠️
- 仅支持 Linux/x64 平台
- 属于实验性功能,稳定性与性能表现可能不如默认 C2 编译器
- 某些场景下性能反而下降,不建议生产环境贸然使用
- 主要用于探索未来 JIT 技术方向,如更灵活的编译策略、语言扩展支持等
🧪 适合人群:JVM 调优工程师、GraalVM 探索者、性能研究爱好者
5. 总结
Java 10 虽然生命周期短,但其背后的技术演进不容忽视。以下是核心亮点回顾:
特性 | 改进点 | 是否推荐使用 |
---|---|---|
并行 Full GC for G1 | 显著降低 Full GC 停顿时间 | ✅ 强烈推荐(无副作用) |
AppCDS | 加速启动 + 降低内存占用 | ✅ 推荐用于微服务/容器场景 |
Graal JIT | 实验性 Java 编写的 JIT | ⚠️ 仅限研究,生产慎用 |
📌 最终建议:
- 如果你关注启动性能和内存效率,AppCDS 是最值得尝试的特性
- G1 并行 Full GC 属于“隐形升级”,升级即受益
- Graal JIT 更像是技术预览,适合前沿探索而非生产落地
Java 10 的这些改进,为后续版本(如 JDK 11 LTS)的性能优化打下了坚实基础。即便不长期使用,也值得在测试环境中体验一番,感受 JVM 持续进化的脉搏。