ホットコード:
これらのコードは、「ホットスポットとして識別される時に仮想マシンが特に頻繁に実行するメソッドまたはコードのブロックを発見したとき、コンパイルするインタプリタ(通訳)によって、仮想マシンのバイトコード(.classファイル、ファイルの内容)コード。 "
JITコンパイラは何ですか。
実行時にホットコードの効率を向上させるために、コードは、タイムコンパイラ(JIT)機械ネイティブプラットフォームに関連付けられたコード、および最適化のすべてのレベルにコンパイルされ、その後、メモリに保存されました。
HotSpot仮想マシンでは、二つのそれぞれC1及びC2コンパイラコンパイラ、JITを構築し、これら二つのコンパイル時にコンパイラが同じではありません。
C1コンパイラは、主な焦点は、例えば、GUIアプリケーションは、一定の要件があります起動速度をインタフェースする、プログラムの開始の短い実行時間やパフォーマンス要件に最適化されたローカライズされ、シンプルかつ高速なコンパイラです。
C2コンパイラは、長い時間のためのプログラムの実施のため長時間実行サーバー側のアプリケーションコンパイラのためのパフォーマンスチューニングを行っているか、ピーク性能のための要件があります。その適応性によると、2回のコンパイルは、また、クライアントコンパイラおよびサーバーコンパイラとして知られています。
どのようにホットスポット検出コードコード:
ホットスポット検出はホットカウンタの検出に基づいており、このアプローチの仮想機会が実行回数は、それが考えられている一定の閾値を超えた場合には、各メソッドの実行統計カウンターの数を確立することである「ホットスポット方法を。」
仮想マシンは、各メソッドのカウンターの2種類の準備ができている:この方法は、(バックエッジカウンタと、プログラムのジャンプ命令で制御の流れに遭遇した後、「裏面」という。)カウンタ(呼び出しカウンタ)とカウンターの裏側を呼び出します。
JITコンパイラの最適化技術:
1.メソッドのインライン
メソッドを呼び出し、通常は実行の元保存され、リターンアドレスに従って、メモリアドレスの実行と実施前のシーンを保護するために要求されたアクションを実行している、プッシュとポップを通過します。したがって、メソッドの呼び出しは、いくつかのオーバーヘッド時間と空間を生成します。
行動インライン方式の最適化メソッド呼び出しを開始したターゲットプロセスにコードをコピーすることで、この方法は、実際の発生を回避するために呼び出します。
PS:しかし、メソッド本体があまりにも、JVMはインライン操作を行わない場合、フォーカス方法は、必ずしも、中に最適化されたJVMに行われないことを強調すること。メソッド本体のサイズのしきい値は、我々はによってパラメータを設定することができます
2.エスケープ解析
分析エスケープ(分析エスケープ)オブジェクトを解析する方法でアクセスするスレッドの外側または外部参照されているかどうかを決定することで、コンパイラは、エスケープ解析の結果に応じてコードを最適化することができます。
スタック上の2.1。の割り当て
私たちは、Javaでオブジェクトを作成することを知っていて、デフォルトでは、ヒープメモリに割り当てられたオブジェクトを作成することで、ヒープオブジェクトが使用されなくなったとき、あなたはガベージコレクション機構に必要としない、このプロセスは、スタックでは比較的割り当てです、より多くの時間がかかり、パフォーマンスを破壊します。オブジェクトが唯一の方法では、オブジェクトがスタックに割り当てられます発見された場合は、この時間は、分析を逃れます。
2.2。ロックの排除
StringBufferのは、修飾同期キーワードの方法は、パフォーマンスの低下をもたらす、ロックするために使用される追加します。
実質上、部分的に差がないではなく、実際には、パフォーマンスとStringBufferのStringBuilderの。オブジェクトがローカルアプローチで作成されたので、これは現在のスレッドのみがアクセスすることができ、他のスレッドがアクセスすることができないで、この変数を読み書き競争を持っていないだろう、この時間メソッドのJITコンパイラは、オブジェクトのロックが解消ロックします。
2.3。またスカラー
エスケープ解析は、プログラムの実際の実装は、オブジェクトを作成し、代わりに変数を作成し、そのメンバーを指示しない場合がありますとき、このオブジェクトは、その後、分割することができる場合は、オブジェクトは、外部からのアクセスではないことを証明しました。オブジェクトを分割した後、オブジェクトメンバ変数は、スタックまたはレジスタに割り当てることができ、元のオブジェクトはメモリ空間アップを割り当てる必要はありません。このコンパイラの最適化は、スカラー交換と呼ばれます。
以下のような:
公共のボイドのfoo(){
TestInfo情報=新しいTestInfo();
info.id = 1。
info.count = 99;
... //何かをします
}
エスケープ分析した後、最適化されたコードは次のようになります。
公共ボイドのfoo(){
ID = 1。
= 99を数えます。
... //何かをします
}
Java8の前に、ホットスポットはJVMにインタイムコンパイルを完了するために、C1とC2と、2 JITを搭載しています。が、JIT最適化されたコードが、収集されたパフォーマンス監視情報は、ランタイムを消費しますし、コンパイルプロセスは、プログラムを実行するための時間がかかります。
Java9に、AOTコンパイラが導入されます。そして異なるJIT、コンパイルと実行時のメモリ消費をするために消費を回避することができますので、AOTは、静的に、プログラムが実行される前に行われるコンパイルされ、AOTコンパイラによっての.classファイルがバイナリの.soファイルにコンパイルすることができます。
Java10、グラールが導入された新しいJITコンパイラに。グラールは、JavaバイトコードコンパイラのJava-メインのプログラミング言語です。C2とC1 C ++の実装、より明白と保守が容易なモジュラーと比較すると。グラール実行時ホットスポットにおけるメソッドをコンパイルする動的コンパイラの両方は、静的コンパイラ、AOTコンパイラとして使用することができます。