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)
  • 自定义类加载器(部分支持)

✅ 这意味着:你的应用类也可以被预处理并共享到归档文件中,从而带来两大好处:

  1. 加快应用启动速度
  2. 多个 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 持续进化的脉搏。


原始标题:Java 10 Performance Improvements