0Pricing
Java Academy · レッスン

JITコンパイルと階層型コンパイル

JVMがホットメソッドを解釈してからJITコンパイルする仕組みと、コンパイルを誘発して観察する方法を学びます。

「JITコンパイルと階層型コンパイル」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

インタープリターとJIT

JVM は最初にバイトコードをインタープリート実行します。メソッドが頻繁に呼び出されて「ホット」になると、JIT コンパイラーがネイティブマシンコードにコンパイルし、実行速度を大幅に向上させます。

階層化コンパイル(Java 8以降のデフォルト)

階層化コンパイルでは、5つの階層を使用します: T0(インタープリター)、T1(C1による単純なコンパイル)、T2(C1による限定的なプロファイリング)、T3(C1による完全なプロファイリング)、T4(C2による完全な最適化)。メソッドは、ホットになるにつれて上位の階層へ移行します。

// Enable/disable tiered compilation:
// -XX:+TieredCompilation   (default ON in Java 8+)
// -XX:-TieredCompilation   (disables — only C2 used)

C1コンパイラー(クライアントコンパイラー)

C1 は中程度の最適化を短時間で実行します。C2 が利用できるように、呼び出し頻度や分岐結果を測定するプロファイリング用の計測コードを追加します。

C2コンパイラー(サーバーコンパイラー)

C2(Opto)は、インライン化、エスケープ解析、ループ展開、ベクトル化、デッドコード除去などの高度な最適化を実行します。最も高速なネイティブコードを生成しますが、コンパイルにはより長い時間がかかります。

// Force server JIT only:
java -server MyApp
// Or explicitly:
java -XX:-TieredCompilation MyApp   // uses C2 only (warm-up is slower)

ホットスポットのしきい値

メソッドは、呼び出しカウンターがしきい値を超えると JIT コンパイルされます。デフォルトは 10,000 回(C2)です。-XX:CompileThreshold=N で調整できます。

// Lower threshold for faster warm-up (at cost of less optimization):
java -XX:CompileThreshold=1000 MyApp

インライン化

インライン化は、C2 で最も効果の大きい最適化です。ホットなコードから呼び出される小さなメソッドを呼び出し位置に「コピー&ペースト」し、メソッドディスパッチのオーバーヘッドをなくすとともに、さらなる最適化を可能にします。

// Check inlining decisions:
java -XX:+PrintInlining -XX:+UnlockDiagnosticVMOptions MyApp
// Output:
// @ 5  com.example.User::getName (5 bytes)   inlined

エスケープ解析

C2 がオブジェクトは現在のメソッド(またはスレッド)の外部に決して逃げないと判断すると、そのオブジェクトをヒープではなくスタックに割り当てられます。これにより、GC の負荷を完全に排除できます。

// Objects that don't escape are stack-allocated:
String result = new StringBuilder().append("Hello ").append(name).toString();
// The StringBuilder may be eliminated by escape analysis

JITコンパイルのログ

-XX:+PrintCompilation を使用すると、各メソッドがコンパイルされるたびにログを出力できます。出力にはメソッド名、階層、コンパイルフラグが示されます。

// java -XX:+PrintCompilation MyApp
// Output:
//    1   n    java.lang.String::hashCode (0 bytes)
//   25   3    com.example.UserService::findById (42 bytes)
//   31   4    com.example.UserService::findById (42 bytes) made not entrant

デ最適化

JIT の前提が破られると(たとえば、呼び出し先の型が変わるクラスがロードされた場合)、C2 は「デ最適化」し、インタープリターまたは C1 に戻ります。これは正常な動作であり、通常は透過的です。

ウォームアップ時間

JIT コンパイルには時間がかかります。短時間で終了するプロセスでは、メソッドが JIT コンパイルされる前に終了することがあります。起動を高速化するには、ahead-of-time コンパイル(GraalVM Native Image)を使用するか、Class Data Sharing(CDS)で JIT の結果をキャッシュしてください。

// Enable AppCDS to cache JIT-compilable classes:
java -XX:ArchiveClassesAtExit=app.jsa -cp app.jar MyApp   # generate archive
java -XX:SharedArchiveFile=app.jsa -cp app.jar MyApp       # use archive

GraalVM JIT

GraalVM は C2 を Java で記述された JIT に置き換えます。より優れた最適化、Java 以外の言語でも JIT を使用できる機能、そして ahead-of-time コンパイルの Native Image の基盤を提供します。

確認問題

小さなメソッドを呼び出し元に統合してメソッド呼び出しのオーバーヘッドをなくす JIT コンパイルの手法は何ですか?

まとめ

階層化コンパイルでは、メソッドが C1(高速なコンパイルとプロファイリング)から C2(高度な最適化)へ移行します。主な最適化は、インライン化、エスケープ解析、ループ展開です。-XX:+PrintCompilation を使用して JIT の判断を確認できます。ベンチマークの前にウォームアップしてください。

よくある質問

「JITコンパイルと階層型コンパイル」レッスンは無料ですか?

はい。「JITコンパイルと階層型コンパイル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「JITコンパイルと階層型コンパイル」で何を学びますか?

JVMがホットメソッドを解釈してからJITコンパイルする仕組みと、コンパイルを誘発して観察する方法を学びます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「JITコンパイルと階層型コンパイル」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. クラスロードの段階:ロード、リンク、初期化
  2. ClassLoader の階層とカスタムローダー
  3. javapでバイトコードを調べる
  4. JITコンパイルと階層型コンパイル
← Java Academyに戻る