Java 10 应用类数据共享 (AppCDS):加速启动与减少内存占用
JEP 310:应用类数据共享
JVM 启动时需加载类到内存,多 JAR 场景下首次请求延迟明显。在 Serverless 等对冷启动敏感的架构中,启动时间至关重要。
Java 5 引入 CDS(Class Data Sharing),仅限 Bootstrap 类。Java 10 扩展为 AppCDS,允许将应用类放入共享归档,跨多个 Java 进程共享类元数据,显著降低启动时间与内存占用。
三步流程
步骤 1:生成类列表
java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=welcome.lst -cp welcome.jar Greeting
-Xshare:off:禁用默认共享,确保捕获完整类加载轨迹。-XX:+UseAppCDS:启用 AppCDS。-XX:DumpLoadedClassList:输出加载类列表到文件。- Greeting 触发类加载。
步骤 2:创建共享归档
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=welcome.lst -XX:SharedArchiveFile=welcome.jsa -cp welcome.jar
-Xshare:dump:创建共享归档模式。-XX:SharedClassListFile:指定步骤 1 生成的类列表。-XX:SharedArchiveFile:指定输出归档文件(.jsa)。
步骤 3:使用共享归档启动
java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=welcome.jsa -cp welcome.jar Greeting
-Xshare:on:强制使用共享归档,失败则报错(生产建议用-Xshare:auto兜底)。
效果与适用场景
- 启动加速:类加载、验证、链接等前期工作在归档构建时完成,运行时直接内存映射。
- 内存节省:多进程共享只读类元数据(Klass、方法表、常量池等),物理内存复用。
- 适配场景:微服务、Serverless 函数、频繁启动的批处理作业、大型框架应用(Spring Boot 等)。
注意事项
- 归档与运行时需完全相同的类路径、模块路径、JVM 版本、架构。
- 类列表生成时应覆盖典型代码路径(可结合测试/预热跑批)。
- 动态生成类(如代理、JSP 编译)不适合放入归档。
- Java 13+ 支持
-XX:ArchiveClassesAtExit简化流程(运行时自动生成)。
java
- 利用 Jlink 优化 PLCnext Control 上的 Java 9+ 应用
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比
- Java 10 应用类数据共享 (AppCDS):加速启动与减少内存占用