2016-08-23 3 views
0

同じコードが何度も実行されずに再起動されるエンタープライズアプリケーションで、コードが複数回、つまり閾値時間を超えてヒットした場合は、とにかく(ほとんどの部分)jitコンパイルされます私はjvmエンジニアがコードをコンパイルしてプラットフォームの独立性を維持し、コードをもう一度コンパイルして、マシンコードを一般的な場合にはより速くするべきではなく、 jvmがコンパイルされていれば、jvmはすべてのプロファイリング情報と統計情報を使用してマシンコードを拡張し、すべての機能拡張を行うことができます。確かにそれはコンパイル時間を要しますが、毎回解釈されるのではなく一般的なコードが実行されます。コンパイルしたコンパイラを作成し、いくつかのメソッドが暑くなった場合にそれを自慢します。私はここで間違っているかもしれませんが、これは興味深い質問です。コンパイルできるのであれば、Javaはなぜコードを解釈しますか?

+0

仮想化には、たとえばリフレクションによるプログラミングなどの利点があります。 また、効率的な質問に関しては、http://stackoverflow.com/questions/2426091/what-are-the-differences-between-a-just-in-time-compiler-and-an-interpreter –

+0

を参照してください。私たちがコンパイルできるときに解釈が必要な理由を尋ねています。最初にバイトコードにコンパイルすることができ、その時点でjvmをコンパイルして何かを解釈する必要はありません。私は彼らが仮想化を行い、プログラムの開始時にコンパイルを行うことができることを意味します。プログラムのスタートアップコストは上昇しますが、 – 1arpit1

+0

Javaはリフレクション(実行時にオブジェクトのフィールドを調べる)、実行時プロキシ実行時に実行されるコード)と他の同様の機能 –

答えて

1

最適化によるコンパイルは非常に高価です。大規模なCプロジェクト(例えばfirefox、linux kernel)のコンパイル時、特にリンク時の最適化を見てください。

JITもターゲットプラットフォーム用にコンパイルされます。つまり、サポートできるすべての使用可能な命令でコンパイルしようとします。つまり、コンパイルされたコードを配布できません。

ここで、JITが間違っていて救済が必要な投機的な最適化(プロファイリングに基づく)を実行するとします。コンパイルのみがオプションであった場合、このコードは再コンパイルされるまで実行を継続できません。インタプリタでは、救済措置の原因となった珍しいコードパスの実行を継続することができます。

また、いくつかの最適化はワークロード固有であることに注意する必要があります。つまり、(悪い)テスト作業負荷が実際の作業負荷とは異なるコードパスを実行し、実行時にプロファイルされた後、 。

すべてのアプリケーションが長期実行デーモンであるとは限りません。 JVMをスピンアップして1つのタスクを実行するものもあれば、完了したら終了するものもあります。

また、多くのコードが1回のみ実行されるとします。アプリケーションの起動またはシャットダウン中に

これらの要因はすべて理由に寄与しています。一部デフォルトでは、JVMはインタプリタ+コンパイラの組み合わせを使用します。他の人はAOTコンパイルされたコードのみを使うことも、テクニカルトレードオフのために通訳を使うこともできますが、一般的には高速ではありません。

0

これは、複数の要素とデザインの選択肢が混在しています。

Javaはバイトコードとして提供され、プラットフォームに依存する永続的なアーティファクトはありません。これはプラットフォームの独立性を確保するための設計上の選択です。 Androidは別の選択肢となりました。これは、主に実行するプラットフォームが制限されているためです。

コードの解釈は、コードをコンパイルして一度だけ実行するよりも高速です。 したがって、適切な起動時間で最高のパフォーマンスを発揮できます。コードが必要なときにコンパイルを開始すると効率的です。コンパイルは別のスレッドで実行され、バイナリは準備ができたらすぐに使用されます。コードが頻繁に使用されると、ホットスポットは複数の繰り返しコンパイルを実行します。実際の動的ランタイム特性を使用することができるため、バイナリは静的な情報しか持たないコードより速くなる可能性があります。

0

ほとんどのコードが十分に速く実行され、ネイティブコンパイルのオーバーヘッドが発生する必要がないため、Javaはほとんどのコードを解釈して実行します。 JIT(HotSpot)エンジンは、使用価値の高いコードを最適化します。さらに、コンテキストでを最適化します。つまり、たとえ変数が理論的に変更されても、シーケンスがレジスタに入れたり、定数として保持できるように、特定のシーケンスのコマンドでは変更されません。仮定に違反すると、JITはそれを解釈モードに戻します。コンパイルを実行すると、実行時の洞察力をすべて失うことになります。 Javaのやり方は、実際にはC++などのコンパイルされた言語よりも、よりタイトで効率的なコードを生成します。

関連する問題