Java 10 新特性之 AppCDS

Oracle 昨天公布了 Java 10 的 GA 版本,Java 10 里面除了本地变量类型推断之外,还扩展了原来的 CDS 的能力为 AppCDS

什么是 CDS

CDS 的全称是 Class-Data Sharing,CDS 的作用是可以让类可以被预处理放到一个归档文件中,后续 Java 程序启动的时候可以直接带上这个归档文件,这样 JVM 可以直接将这个归档文件映射到内存中,以节约应用启动的时间。

这个特性其实 JDK 1.5 就开始引入了,但是 CDS 只能作用与 Boot Class Loader 加载的类,不能作用于 App Class Loader 或者自定义的 Class Loader 加载的类,其实有点鸡肋,而且这个是 Oracle JDK 的商业特性,在 OpenJDK 中似乎没有。

这次在 Java 10 中,则将 CDS 扩展为 AppCDS,顾名思义,AppCDS 不止能够作用于 Boot Class Loader,App Class Loader 和自定义的 Class Loader 也都能够起作用,大大加大了 CDS 的适用范围。有了 AppCDS,可以给 Java 的应用程序带来两个方面的好处:

  • 可以提升一些大型的 Java 应用的启动速度。
  • 可以提升 Serverless 的应用程序的启动速度。我觉得这个点可能是 Java 10 提供 AppCDS 的主要原因,Serverless 极可能成为未来的应用的一种非常常见的形态,而把 Java 应用在 Serverless 上,相比于其他的语言来说,一个很大的劣势就是 JVM 的启动速度太慢了,虽然像 AWS 的 Lambda,会给 Java 的 Serverless 应用加上 -client 来用 Client 模式跑加快启动速度,但是实际上效果甚微。有了 AppCDS,可以大大加快 Serverless 应用的启动速度,按照 AppCDS 的 JEP 的说明,对于一个 JEdit 来说,AppCDS 可以为 JEdit 提升 20% 到 30% 的启动速度。

尝试 AppCDS

作者写了一个简单的 Java 应用,来测试 AppCDS 的效果。程序的代码已经放到了 Github 上面,大家可以直接去看,这里只给出大概的操作步骤和最后的测试效果。

1. 决定要 Dump 哪些 Class

一般来说,一个 Java 应用程序会包含很多的 Class 文件,但是在运行中,并不是所有的 Class 文件都会被用到,所以,第一步我们需要来决定具体需要使用哪些 Class 文件,你需要给你的运行命令上加上如下的 JVM 参数:

-Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst

几个参数的意思分别是:

  • -Xshare:off:这个参数的意思是不做任何内存的共享,也就是不利用 AppCDS 产生的文件来做内存映射。因为是要决定 Dump 哪些类的内存到归档文件中,所以这个参数需要关掉。
  • -XX:+UserAppCDS:默认的情况下 AppCDS 不会开启,所以我们需要加上这个参数来开启 AppCDS。
  • -XX:DumpLoadedClassList:表示需要把需要做 Dump 的类名写入到哪个文件中。

这个命令执行之后,会出现一个 hello.lst 的文件,里面就是一个个的类名,下面是一部分内容的截图:

app_cds_dump_file_list.png

2. 将类的内存 Dump 到归档文件中

有一个需要 Dump 的类的列表之后,第二步,我们就可以将类的内存 Dump 到归档文件中了,在这一步中,我们需要将以下的参数加入到 JVM 参数中去:

-Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa

几个参数的含义分别如下:

  • -Xshare:dump:表示现在要进行类的内存的 Dump。
  • -XX:SharedClassListFile:用来指定需要 Dump 的类的列表。
  • -XX:SharedArchiveFile:表示需要将类的内存 Dump 到哪个归档文件中。

运行上面的命令之后,我们会得到一个 hello.jsa 的文件,包含需要的内存信息的 Dump。

3. 使用 Dump 出来的归档文件加快应用启动速度

有了前面的归档文件之后,我们就可以来加速应用的启动速度了,为了使用上述的归档文件,我们需要在 JVM 中加上如下的参数:

-Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa

几个参数的含义分别如下:

  • -Xshare:on:表示打开内存映射。
  • -XX:SharedArchiveFile=hello.jsa:表示用来做内存映射的归档文件是 hello.jsa

4. 测试效果

在我的本机上,不使用 AppCDS 和使用 AppCDS 的效果如下:

不使用 AppCDS

app_cds_disable.png

使用 AppCDS

app_cds_enable.png

可以看到,对于这样一个简单的应用,AppCDS 还是有 20% 左右的启动速度提升的,当然这个应用的很多的启动时间都花在了类加载上,其他的耗时不多,所以效果挺好。如果其他的应用程序的启动时间花在类上的加载时间比较少的话,可能效果就没有这么明显。

看起来 AppCDS 很美好,但是目前我使用下来有几个坑:

  • 虽然 AppCDS 号称可以支持自定义的 ClassLoader,但是我试了一个 SpringBoot 的应用,发现对于没有在 -classpath 中指定的 JAR 包中的类,并不会有效果。
  • 如果你下载 Oracle 的 JDK,需要加上 -XX:+UnlockCommercialFeature 来开启 AppCDS,但是 OpenJDK 却不用,也是很奇怪,😅
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 一 、java虚拟机底层结构详解 我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统、存储区域、...
    葡萄喃喃呓语阅读 1,468评论 0 4
  • 1∥ 又到了“剁手”的季节,空气中弥漫着期待和欢乐的气息。 大群的“剁手”党慢慢游弋聚拢,渴望一年一度放纵他们的欲...
    打折的杨过阅读 424评论 2 3
  • 字典的介绍 字典允许按照某个键来访问元素 字典是由两部分集合构成的,一个是键(key)集合,一个是值(value)...
    梦醒繁华阅读 15,112评论 3 1