web-dev-qa-db-ja.com

JITがバイトコード変換を機械語命令に実行している場合のJVMの使用方法

私は次のことを理解するのに本当に苦労しています

以前私は知っています:

Javaプログラムがコンパイルされるとき.classファイルが生成されます。そのコードではバイトの形式です。次に、JVMはそのバイトコードを機械が理解できる形式に変換します。

今私は SOの質問の1つを見ます

ジャストインタイム(JIT)コンパイラーは、ランタイムインタープリターの機能であり、メソッドが呼び出されるたびにバイトコードを解釈する代わりに、実行中のマシンのマシンコード命令にバイトコードをコンパイルします。

したがって、ここでJITはバイトコードを機械語命令に変換しています。次に、JVMの用途は何ですか。 JITでこれを行うことができます。私の知る限りでは、JITはJVMのパフォーマンスを向上させるためだけのものです。

30
Anusha

JITは、JVMの部分です。その他の部分には、バイトコードインタープリター、クラスロード検証およびリンクメカニズム、リフレクション、I/Oなどのネイティブコードサポートが含まれます。

その意味で、JITはJVMの実行をまったく速くしません。代わりに、Javaコードの実行速度が... JVMが解釈した場合よりも速くなります。

実際には、JVMはバイトコードの解釈を開始します。しばらくすると、JVMはJITコンパイラを使用して、使用頻度の高いメソッドをネイティブコードにコンパイルし、解釈中に収集された統計情報を使用して、問題のコードを調整します。

ところで、あなたが引用したテキストのこの部分は不器用で技術的に不正確です:

ジャストインタイム(JIT)コンパイラは、ランタイムインタプリタの機能です... (context)

実際、JITはインタープリターの機能ではありません。むしろ、JITはJVMの機能でありインタープリターと一緒に機能します。

31
Stephen C

明確にするために:

JVMは次のようなすべてを実行します。

これはオペレーティングシステムの上部にあり、コンパイルされたJavaプログラムとオペレーティングシステムの間の抽象化を提供します。このように、JavaコンパイルされたプログラムはJavaプログラムは、JVMが理解して実行できるバイトコードにコードをコンパイルします。

JIT

JVMがクラスファイルをコンパイルしても、完全なクラスファイルは完成しません。必要に応じてその一部のみをコンパイルします。これにより、完全なソースコードの大量の解析が回避されます。このタイプのコンパイルは、JITまたはJust-In-Timeコンパイルと呼ばれます。 JVMはプラットフォーム(OS)に依存するコード生成JITはプラットフォーム指向であり、ネイティブバイトコードを生成するため、JVMよりも高速です:)

2
ABraham K

Java仮想マシン(JVM)は、Javaプログラムを実行するための環境全体を提供します。オペレーティングシステムと統合し、クラスをロードし、プログラムを実行します。 Just-In-Timeコンパイラー(JIT)は、無効にすることができる(-Xint)ほんの一部ですが、有効にすると、パフォーマンスが向上します。JITを含まないJVMの実装と実装これは、CやC++などの従来の言語とまったく同じように、マシンコードにプリコンパイルするJavaで機能しました。

1
Craig Trader

最適化されたJVMに合わせてコンパイルされます。

0
niklas