15

Microsoft .NETはCLRをJITコンパイラとして使用しますが、Javaにはホットスポットがあります。それらの違いは何ですか?

4

1 に答える 1

26

彼らは非常に異なる獣です。人々が指摘しているように、CLRはMSILの一部を実行する前にマシンコードにコンパイルされます。これにより、通常のデッドコードの除去とプライベート最適化のインライン化に加えて、ターゲットマシンの特定のCPUアーキテクチャを利用できるようになります(それが行われるかどうかはわかりませんが)。これにより、クラスごとにヒットが発生します(ただし、コンパイラはかなり高速で、多くのプラットフォームライブラリはWin32 APIの単なる薄い層です)。

HotSpotVMは別のアプローチを採用しています。ほとんどのコードはめったに実行されないことが規定されているため、コンパイルに時間を費やす価値はありません。すべてのバイトコードはインタプリタモードで始まります。VMは呼び出しサイトで統計を保持し、事前定義された回数を超えて呼び出されたメソッドを識別しようとします。次に、これらのメソッドのみを高速JITコンパイラー(C1)でコンパイルし、実行中にメソッドを交換します(これがHSの特別なソースです)。C1でコンパイルされたメソッドが何度か呼び出された後、同じメソッドが低速ですが洗練されたコンパイラーでコンパイルされ、コードはその場で再び交換されます。

HotSpotは実行中にメソッドを交換できるため、VMコンパイラーは、静的にコンパイルされたコードでは安全ではないいくつかの投機的最適化を実行できます。正規の例は、モノモーフィック呼び出しの静的ディスパッチ/インライン化です(実装が1つだけのポリモーフィックメソッド)。これは、このメソッドが常に同じターゲットに解決されることをVMが認識した場合に実行されます。以前は複雑な呼び出しであったものが、最新のCPUによって予測され、パイプライン化されるいくつかのCPU命令ガードに削減されます。ガード条件が真でなくなると、VMは別のコードパスを使用するか、解釈モードに戻ることができます。統計とプログラムのワークロードに基づいて、生成されるマシンコードは異なる時点で異なる可能性があります。

これが、アルゴリズムのベンチマークを行うときにJVMをウォームアップし、現実的なワークロードをエミュレートする必要がある理由です(歪んだデータは、最適化の非現実的な評価につながる可能性があります)。その他の最適化には、ロックの省略、適応スピンロック、エスケープ分析、スタック割り当てなどがあります。

とはいえ、HotSpotはVMの1つにすぎません。JRockit、Azul、IBMのJ9、およびリセット可能なRVMは、すべて異なるパフォーマンスプロファイルを持っています。

于 2010-04-16T15:21:42.987 に答える