Dynamic CDSよりJava10からある自力ダンプの方が起動が速い

昨日のエントリでDynamic CDSを使いましたが、自分でダンプしたクラスデータを使うほうが速くなりました。
Java 13のDynamic CDSで想像以上に起動速度が速くなった - きしだのHatena

Java 10からOpenJDKでもApp CDSが使えるようになりました。Oracle JDKでは8u40からあるっぽい。
JEP 310: Application Class-Data Sharing

Dynamic CDSと違うのは、クラス一覧を指定しないといけないところ。

クラス一覧は、こんな感じで-XX:DumpLoadedClassListでファイル名を指定すると生成されます。

$ java -Xshare:off -XX:DumpLoadedClassList=mn.lst -jar build/libs/myapp-0.1.jar 

そうするとこんな感じでロードされたクラス一覧が記録されます。

java/lang/Object
java/lang/String
java/io/Serializable
java/lang/Comparable
java/lang/CharSequence
java/lang/Class
...

このクラス一覧を使ってクラスデータをダンプします。このとき、アプリケーションは実行されません。ダンプだけ行われます。

$ java -Xshare:dump -XX:SharedClassListFile=mn.lst -XX:SharedArchiveFile=mn13.jsa -jar build/libs/myapp-0.1.jar
Allocated shared space: 3221225472 bytes at 0x0000000800000000
Loading classes to share ...
Preload Warning: Cannot find jdk/internal/misc/JavaLangRefAccess
Preload Warning: Cannot find jdk/internal/misc/SharedSecrets
Preload Warning: Cannot find jdk/internal/misc/JavaIOFileDescriptorAccess
Preload Warning: Cannot find jdk/internal/misc/JavaNioAccess
...

実行はDynamic CDSを使う場合と同じです。

$ java -XX:SharedArchiveFile=mn13.jsa -jar build/libs/myapp-0.1.jar 

Java 11ではそれぞれに-XX:+UseAppCDSをつけておく必要があります。
計測したら、だいぶ速くなっていました。6回実行して2回目以降5回分の平均をとっています。

JVM起動 アプリケーション起動
No CDS 149.6 1028.6
Default CDS 98.6 1009.2
Dynamic CDS 89.2 688.8
AOT+DynCDS 144 625.6
App CDS 93 451.4

なにも指定していない場合の倍の速さで起動していますね。

f:id:nowokay:20191019001323p:plain