Closed6
Java Performance 2nd edition 4章
JITコンパイラ
Hotspot Compilation
hotspotと呼ばれる由来。
アプリケーション全体が満遍なく実行されることはそうそうない。
いくつかのサブセットが頻繁に実行されることが多い。
このサブセット群がより実行されればされるほど、それらはホットとみなされる。
アプリケーションの性能は、このホットスポットがいかに早く実行されるかに依存する傾向。
JITコンパイラが実行初期段階で中間コードをコンパイルしない理由。
- ループ処理や再利用処理がない場合、コンパイル処理そのものがネックとなる可能性
- コードに関する情報がなく最適化が施せない。
ホットスポットがない場合は、コンパイル処理がネックとなる。
中間コード(Javaバイトコード)をJava Interpreterで解釈した方が早い。
ホットスポットがどこか最初はコンパイラは知らない。
また、コードに関する情報も最初はほとんど知らない。
JVMが特定のメソッドやループを実行すればするほど、コードに関する情報が増え、最適化が行えるようになる。(型情報等)
Tiered Compilation
- C1: クライアントコンパイラ
- コード実行の初期段階ではより多くのコードをコンパイル
- C2: サーバーコンパイラ
- コンパイル済みのコードに対してより良い最適化を実施
コンパイルログに、各メソッドがどの階層でコンパイルされたかが主力される。
- 0: interpreted code
- 1: シンプルなC1コンパイルコード
- 2: 限定C1コンパイルコード
- 3: 完全なC1コンパイルされたコード
- 4: C2コンパイル済みコード
最初、ほとんどのコードはレベル3でコンパイルされる。
JITコンパイルは非同期でなされるため、C1,C2それぞれにキューが存在する。
これらのキューは厳密にはFIFOではなく、呼び出しカウンタが大きいメソッドが優先される。
The GraalVM
完全なネイティブバイナリーを生成可能。
GraalVMは、C2コンパイラの新しい実装を含む。
Ahead-of-time (AOT) コンパイルは、
アプリケーションの一部(または全部)を実行前にコンパイルすることができる。
コンパイルされたコードは、共有ライブラリとなり、アプリケーション起動時にJVMが使用する。
GraalVMは、C2コンパイラほど積極的にコードを最適化しないため、
長く実行されるアプリケーションがあれば、最終的には従来のJVMの方が有利。
このスクラップは2022/10/09にクローズされました