バイトコードのコンパイルとバイトコードの解釈が区別されているように見えるJVM/JITアクティビティに関するいくつかの参照に出くわしました。特定のコメントによると、バイトコードは最初の10000回の実行で解釈され、その後コンパイルされます。
バイトコードの「コンパイル」と「解釈」の違いは何ですか?
バイトコードのコンパイルとバイトコードの解釈が区別されているように見えるJVM/JITアクティビティに関するいくつかの参照に出くわしました。特定のコメントによると、バイトコードは最初の10000回の実行で解釈され、その後コンパイルされます。
バイトコードの「コンパイル」と「解釈」の違いは何ですか?
バイトコードの解釈は、基本的にバイトコードを1行ずつ読み取り、最適化などは行わず、解析してリアルタイムで実行します。これは、Javaバイトコードが迅速に解釈されるように設計されていないという問題を含む多くの理由で特に非効率的です。
メソッドがコンパイルされると、JITはメソッド全体をロードし、バイトコードを1行ずつ読み取って解釈するのではなく、CPU上で直接実行するネイティブコードを生成します。メソッドが一度コンパイルされると、生成されたネイティブコードは、メソッドが呼び出されるたびに直接使用されます。これは天文学的に高速ですが、メソッドがコンパイルされるときにいくらかのオーバーヘッドが発生します。特に、JVMは、頻繁に呼び出されるメソッドのコンパイルのみを担当し、非常に頻繁に呼び出される「タイトな内部ループ」コードのパフォーマンスを最大化しながら、オーバーヘッドを最小化します。
バイトコードがインタープリターされる場合、プロセッサー上で直接実行されるのではなく、JVMインタープリターを介して実行されます。コンパイルされる場合、ネイティブマシン言語にコンパイルされ、CPU上で直接実行されます。
JVMにはジャストインタイム(JITコンパイラ)があります。十分に繰り返されるコードの部分は、それを高速化するためにネイティブアセンブラーコードにコンパイルされる場合があります。
変更はJVMでのみ行われ、クラス(jar / war)ファイルは変更されず、バイトコードとして残ることに注意してください。