Closed6

Java Performance 2nd edition 4章

pp

Hotspot Compilation

hotspotと呼ばれる由来。
アプリケーション全体が満遍なく実行されることはそうそうない。
いくつかのサブセットが頻繁に実行されることが多い。
このサブセット群がより実行されればされるほど、それらはホットとみなされる。

アプリケーションの性能は、このホットスポットがいかに早く実行されるかに依存する傾向。

pp

JITコンパイラが実行初期段階で中間コードをコンパイルしない理由。

  • ループ処理や再利用処理がない場合、コンパイル処理そのものがネックとなる可能性
  • コードに関する情報がなく最適化が施せない。

ホットスポットがない場合は、コンパイル処理がネックとなる。
中間コード(Javaバイトコード)をJava Interpreterで解釈した方が早い。

ホットスポットがどこか最初はコンパイラは知らない。
また、コードに関する情報も最初はほとんど知らない。
JVMが特定のメソッドやループを実行すればするほど、コードに関する情報が増え、最適化が行えるようになる。(型情報等)

pp

Tiered Compilation

https://ufcpp.net/blog/2018/12/tieredcompilation/

https://www.slideshare.net/jyukutyo/introduction-to-jit-compiler-in-jvm-200149242

  • C1: クライアントコンパイラ
    • コード実行の初期段階ではより多くのコードをコンパイル
  • C2: サーバーコンパイラ
    • コンパイル済みのコードに対してより良い最適化を実施

コンパイルログに、各メソッドがどの階層でコンパイルされたかが主力される。

  • 0: interpreted code
  • 1: シンプルなC1コンパイルコード
  • 2: 限定C1コンパイルコード
  • 3: 完全なC1コンパイルされたコード
  • 4: C2コンパイル済みコード

最初、ほとんどのコードはレベル3でコンパイルされる。
JITコンパイルは非同期でなされるため、C1,C2それぞれにキューが存在する。

pp

これらのキューは厳密にはFIFOではなく、呼び出しカウンタが大きいメソッドが優先される。

pp

The GraalVM

https://www.infoq.com/jp/articles/native-java-graalvm/

完全なネイティブバイナリーを生成可能。
GraalVMは、C2コンパイラの新しい実装を含む。

Ahead-of-time (AOT) コンパイルは、
アプリケーションの一部(または全部)を実行前にコンパイルすることができる。
コンパイルされたコードは、共有ライブラリとなり、アプリケーション起動時にJVMが使用する。

GraalVMは、C2コンパイラほど積極的にコードを最適化しないため、
長く実行されるアプリケーションがあれば、最終的には従来のJVMの方が有利。

このスクラップは2022/10/09にクローズされました