一年多以前,我写过一篇文章 Java 10 新特性之 AppCDS ,文章的最后有一个结论:
虽然 AppCDS 号称可以支持自定义的 Classloader,但是我试了一个 SpringBoot 的应用,发现对于没有在 -classpath 中指定的 JAR 包中的类,并不会有效果。
在 Java 的世界中,自定义的 Classloader 情况太多了,这个大大限制了 AppCDS 的应用,不过,这次看了 JDK13 的 Release Note,很开心看到 JDK13 对 CDS 的功能进行了增强,本次对 CDS 的增强主要是两个方面:
-cp
接下来,我们就尝试一下在 SOFABoot 中使用 Dynamic CDS,首先新建一个 Spring Boot 的应用,并且把 parent 替换为:
<parent>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofaboot-dependencies</artifactId>
<version>3.1.5</version>
</parent>
然后我们可以编译并且启动一下,看下耗时情况:
➜ time java -jar target/dynamiccds-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/// / ___'_ __ _ _(_)_ __ __ _ / / / /
( ( )/___ | '_ | '_| | '_ // _` | / / / /
/// ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_/__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.0.RELEASE)
2019-10-08 23:16:55.768 INFO 69815 --- [ main] c.e.dynamiccds.DynamiccdsApplication : Starting DynamiccdsApplication v0.0.1-SNAPSHOT on lotus.local with PID 69815 (/Users/khotyn/Downloads/dynamiccds/target/dynamiccds-0.0.1-SNAPSHOT.jar started by khotyn in /Users/khotyn/Downloads/dynamiccds)
2019-10-08 23:16:55.772 INFO 69815 --- [ main] c.e.dynamiccds.DynamiccdsApplication : No active profile set, falling back to default profiles: default
2019-10-08 23:16:56.377 INFO 69815 --- [ main] c.e.dynamiccds.DynamiccdsApplication : Started DynamiccdsApplication in 0.981 seconds (JVM running for 1.411)
java -jar target/dynamiccds-0.0.1-SNAPSHOT.jar 4.14s user 0.29s system 301% cpu 1.473 total
耗时时间是 4.14s。
然后我们用如下的命令生成一下 Class 的 Dump:
java -XX:ArchiveClassesAtExit=dcds.jsa -jar target/dynamiccds-0.0.1-SNAPSHOT.jar
然后我们再执行以下命令就可以使用刚才 Dump 出来的文件了:
time java -XX:SharedArchiveFile=dcds.jsa -jar target/dynamiccds-0.0.1-SNAPSHOT.jar
可以看下输出:
➜ time java -XX:SharedArchiveFile=dcds.jsa -jar target/dynamiccds-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/// / ___'_ __ _ _(_)_ __ __ _ / / / /
( ( )/___ | '_ | '_| | '_ // _` | / / / /
/// ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_/__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.0.RELEASE)
2019-10-08 23:20:44.078 INFO 70738 --- [ main] c.e.dynamiccds.DynamiccdsApplication : Starting DynamiccdsApplication v0.0.1-SNAPSHOT on lotus.local with PID 70738 (/Users/khotyn/Downloads/dynamiccds/target/dynamiccds-0.0.1-SNAPSHOT.jar started by khotyn in /Users/khotyn/Downloads/dynamiccds)
2019-10-08 23:20:44.083 INFO 70738 --- [ main] c.e.dynamiccds.DynamiccdsApplication : No active profile set, falling back to default profiles: default
2019-10-08 23:20:44.636 INFO 70738 --- [ main] c.e.dynamiccds.DynamiccdsApplication : Started DynamiccdsApplication in 0.91 seconds (JVM running for 1.462)
java -XX:SharedArchiveFile=dcds.jsa -jar target/dynamiccds-0.0.1-SNAPSHOT.jar 2.94s user 0.30s system 210% cpu 1.540 total
耗时是 2.94s,时间快了将近一秒多,这个时间可能相比于有大量业务逻辑的应用来说意义不大,但是也算是非常可观了。