「Java 13のDynamic CDSで想像以上に起動速度が速くなった」を Docker コンテナで試してみた

nowokay.hatenablog.com気になったので自分でも計測してみることにしました。

あと、マルチステージビルドでうまく分離できそうだったので試してみました。

 

java dynaimc cds in container

工夫したつもりなのは次のような点。

3ステージで構成

Micronaut のスケルトンプロジェクトをビルドするためのステージ。
mn を使うために SDKMAN をインストールしてるのは結構ムダだと思う。

クラスアーカイブを生成するためのステージ。
ケルトンプロジェクトはサーバーアプリなので、起動することが確認できたら停止するために timeout コマンドを利用してる。

実行用のステージ。
ENTRYPOINT に timeout コマンドを指定するのはすぐに停止したいから。
CMD に jar ファイルを実行するコマンドを指定しているので、環境変数 JAVA_OPTS を変更すれば振る舞いを変更できる。

java.base の AOT はかなりリソースを使用する

何回か試したけど docker build の環境では OutOfMemoryError の発生を回避できませんでした。どうやら Java ヒープに 4 GB くらい必要な模様。
PCで実行したときは成功したけどできた so ファイルは 1 GB 近くなっており、コンテナイメージに含めるべきではないと思った。

[JDK-8176141] [AOT] jaotc compilation of java.base module hangs sometimes - Java Bug System

[JDK-8175214] [AOT] OOM compiling jdk.internal.module.SystemModules.descriptors() - Java Bug System

計測結果

| パターン | JVM | Micronaut |
| NoCDS | 257.3 | 2927.2 |
| DefaultCDS | 230.9 | 2967.6 |
| DynamicCDS | 230.9 | 3162.1 |

元記事とは違い、どの構成でも変化は見られなかった。なんでだろう。

調査

JVM log で読み込んだクラスと読み込み元を集計するとなんだか不穏な感じ。

まったく効いてないわけじゃないみたい。

 

読み込み元
jar ファイル以外 3157
jar ファイル 2409

jar ファイル以外から読み込んだクラス数のパッケージ内訳。

パッケージ名 クラス数
io.micronaut 942
java.util 473
java.lang 319
jdk.internal 191
ch.qos 176
com.fasterxml 148
com.sun 137
org.yaml 114
sun.util 68
sun.nio 67
 
jar ファイルから読み込んだクラス数のパッケージ内訳。
パッケージ名 クラス数
io.micronaut 826
io.reactivex 456
io.netty 340
com.fasterxml 279
java.lang 108
java.util 82
ch.qos 65
java.nio 36
org.yaml 24
sun.nio 22
 

 

 

参考リンク