Javaの起動を劇的に速くするJEP 544、AOTコンパイルをHotSpotに導入
JEP 544: Ahead-of-Time Code Compilation
JEP 544は、トレーニング実行でアプリケーションの最適化されたネイティブコードをAOTキャッシュに保存し、本番実行時に即座に利用可能にすることで、Javaアプリケーションの起動とウォームアップを大幅に改善する。ワークロードが変化した場合にはJITコンパイルへシームレスに移行し、ピーク性能を維持する。既存のAOTキャッシュワークフローを拡張するだけで、アプリケーションやフレームワークの変更は不要。ベンチマークでは起動時間が最大80%短縮された。
動的コンパイルはアプリケーションを俊敏にする。なぜなら、アプリケーションのホットスポットの変化に応答するからだ。必要に応じて非最適化と再最適化を行い、ワークロードの変化に応じて性能を持続させる。
HNでの議論
40- cogman10
Leydenはトレーニング実行にかなり依存しているのは分かるけど、そのセットアップの負担が半端ないんだよな。
こういうトレーニング実行を行うためのツールは実際には存在しないから、ビルドパイプラインの一部としてもっと特注のものを自分で作る必要がある。特に私がメンテしているような複雑なアプリケーションでは、それが非常に厄介になり得る。
これが提供できるものは気に入っているけど、動かすまでに必要な労力は好きになれない。
- treyd
これとAndroidのAOTランタイムとのアーキテクチャの違いは何ですか?
- cyberax
Excelsior JETは25年前にそれをやっていた:https://en.wikipedia.org/wiki/Excelsior_JET
Sun/Oracleが彼らと提携してネイティブアプリを提供しなかったのは残念だ。これがあればデスクトップでのJavaを救えたかもしれない。
- java-man
いつかAOT専用モード(またはネイティブへのコンパイル)、できればクロスコンパイルもできるようになるといいな。
- ledo9915
小さなサイドプロジェクトからのデータポイント:コーディングチャレンジサイトでPistonサンドボックス内のユーザーコードを実行している。些細なJavaプログラムが4 vCPUのボックスで壁時計時間2.5〜3秒かかり、そのほとんどがjavacとJVMの起動だ。Goはビルドと実行を合わせて約1.7秒、Swiftはインタプリタ経由で0.4秒だ。Javaのせいで、コンパイル言語全体にグローバルなレート制限をかけざるを得なかった。もしAOTでJVM側が数百ミリ秒まで下がれば、小さなボックスで提供できるものが変わる。