2016-12-14 4 views
1

私は、on-stack replacement(OSR)が一般的にどのように動作するのか理解していますが、OSRコンパイルされたメソッドは、メソッドがコンパイルをトリガした最初の呼び出しを残すと有用かどうかは分かりません.JITedコードは、 ?OSRコンパイルされたメソッドは、後続の呼び出しで使用できますか?

インタプリタが同じバイトコードインデックスに進むと、元のOSRが起動してからOSRコンパイル済みのメソッドに再び入ることができるようです。

ホットスポットがすぐにOSRで自分の方法を2回(別のBCIで)コンパイルするケースがありますが、通常のC2非OSRコンパイルは実行されていない数分(数百万回以上の呼び出しにもかかわらず)。だから、その間にOSR C2メソッドを使用しているのではないかと思います(非OSR C1メソッドもあります)。

答えて

1

はい、再利用できます。しかし、それらが生成されたのと同じバイトコードインデックスでのみ、そしてコンパイルポリシーのバックブランチイベントに応答してのみです。

HotSpot InstanceKlass構造体(Javaクラスの内部表現)は、クラスのためにlist of OSR methodsを保持します。コンパイルが要求されるたびに、CompileBroker looks forがこのリストの既存のNMethodになります。

私はあなたの特定のケースについて詳しくは詳しくは分かりませんが、与えられた説明からアプリケーションがC1コンパイルバージョンを呼び出すと思われます。メソッドのエントリポイントは決してOSRコンパイルされたNMethodに設定されません。

+0

はい、最終的に私はそれを再現しませんでした。後の実行では、起動後に通常の非OSR C2(レベル4)コンパイルが1秒以内にコンパイルされるというホットな方法を示しました。上がってた。 _Timing_がOKを実行していたことを示すように見えたのは、LogCompilationの出力(たとえば、PrintAssemblyが同時に書き込んでいた? – BeeOnRope

+0

「同じバイトコード**のインデックス**で、それらが生成されました...」という意味ですか? – BeeOnRope

+0

@BeeOnRopeはい、訂正していただきありがとうございます。 – apangin

関連する問題