昨日のエントリで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 |
なにも指定していない場合の倍の速さで起動していますね。