0

0

什么是Java中的类数据共享(CDS)_优化JVM启动速度与内存占用

P粉602998670

P粉602998670

发布时间:2026-02-16 08:13:03

|

462人浏览过

|

来源于php中文网

原创

java cds(类数据共享)是jvm启动优化技术,通过预生成并内存映射类归档文件,跳过解析、链接、验证等步骤,显著降低启动时间和内存占用,尤其适用于容器化、微服务冷启和ci/cd场景。

什么是java中的类数据共享(cds)_优化jvm启动速度与内存占用

Java CDS 是什么,为什么现在还值得用

类数据共享(CDS)不是过时技术,而是 JVM 启动优化里少数能同时压低启动时间、减少内存占用的实招——尤其在容器化部署、微服务冷启、CI/CD 测试环境反复拉起 JVM 的场景下,效果直接可测。

它的核心逻辑很简单:java 在首次运行时把一堆基础类(rt.jarmodules-java.base 等)和你指定的自定义类 dump 成一个内存映像文件(shared archive),后续启动时直接 mmap 进内存,跳过解析、链接、验证等步骤。

容易踩的坑:JDK 10+ 默认启用 -XX:+UseSharedSpaces,但没生成 archive 就会静默退回到普通模式,不报错也不提示;JDK 17+ 还默认禁用 rt.jar 支持,必须用模块化方式构建 archive。

怎么生成并加载 CDS 归档文件(JDK 11+ 实操)

生成 archive 分两步:先预估类列表,再 dump。不能直接对生产 jar 包操作,必须用真实启动参数模拟一次类加载路径。

立即学习Java免费学习笔记(深入)”;

Synthesia
Synthesia

Synthesia是一个AI视频生成平台,可以让用户创建120种语言的视频。

下载
  • -Xshare:dump 前,先跑一次带 -XX:+PrintSharedArchiveAndExit 的启动,确认当前 JVM 支持共享空间
  • 生成基础归档:java -Xshare:dump -XX:SharedArchiveFile=./base.jsa(JDK 自带类)
  • 生成应用归档需先收集类列表:java -XX:+UseAppCDS -XX:DumpLoadedClassList=classes.lst -cp myapp.jar MyApp,再用该列表构建:java -Xshare:dump -XX:SharedArchiveFile=./myapp.jsa -XX:SharedClassListFile=classes.lst -cp myapp.jar
  • 加载时必须显式指定:java -Xshare:on -XX:SharedArchiveFile=./myapp.jsa -cp myapp.jar MyApp-Xshare:on 会失败退出,-Xshare:auto 才是静默 fallback

注意:classes.lst 必须用同版本 JDK 生成,且 classpath 路径、JAR 时间戳、模块版本任何一项不一致,archive 就失效——CI 中建议把归档文件和 JDK 版本绑定发布。

CDS 归档失效的典型错误信息和排查点

最常遇到的不是报错,而是“没生效”:启动时间没变、RSS 内存没降、jstat -compiler 显示 loaded class 数量照旧。这时候要看三件事:

  • 检查是否真加载了:java -Xshare:on -XX:SharedArchiveFile=./myapp.jsa -XX:+PrintSharedArchiveAndExit -cp myapp.jar MyApp,输出里要有 Shared archive is mapped 和具体类数量
  • 常见错误信息:Unable to map shared archive(路径错/权限不足)、Shared archive file has wrong magic number(JDK 版本或构建参数不匹配)、Failed to map in SharedReadOnlySpace(Linux 上 ASLR 干扰,加 -XX:+AlwaysPreTouch 或关掉 /proc/sys/kernel/randomize_va_space
  • 使用 -verbose:class 对比开启/关闭 CDS 时的类加载日志:如果 [classload] java.lang.Object 这类基础类仍显示 “loaded by” 而非 “shared objects file”,说明归档未命中

JDK 17+ 模块化 CDS 的关键变化

JDK 9 引入模块系统后,CDS 行为变了本质:不再支持 rt.jar,所有类必须通过 --module-path--add-modules 显式声明;-XX:SharedClassListFile 列出的类必须已由模块解析器加载过。

  • 不能再用 -cp + classes.lst 传统方式;必须先用 --describe-module 确认目标类所属模块,再用 --add-modules 加载它
  • 生成归档时要带上完整模块参数:java --module-path mods --add-modules ALL-SYSTEM,my.app -Xshare:dump -XX:SharedArchiveFile=myapp.jsa
  • java.base 等系统模块归档仍可用 JDK 自带的 base.jsa,但应用模块归档必须与模块图严格一致——换了个 requires 就得重做

模块化 CDS 的复杂度明显上升,但它换来的是更稳定的归档兼容性:只要模块签名不变,哪怕 class 文件微调(如 debug info 变更),archive 仍可复用。这点在频繁构建的流水线里反而更省心。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

417

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

589

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

604

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

21

2025.12.06

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

46

2025.11.27

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.6万人学习

C# 教程
C# 教程

共94课时 | 9.5万人学习

Java 教程
Java 教程

共578课时 | 66.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号