「Java 13のDynamic CDSで想像以上に起動速度が速くなった」を Docker コンテナで試してみた
nowokay.hatenablog.com気になったので自分でも計測してみることにしました。
あと、マルチステージビルドでうまく分離できそうだったので試してみました。
工夫したつもりなのは次のような点。
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 ファイル以外から読み込んだクラス数のパッケージ内訳。