2016-12-14 32 views
1

我明白on-stack replacement(OSR)通常如何工作,但我不明白OSR編譯的方法是否曾經有用,一旦方法離開觸發編譯的初始調用 - JITed代碼是否可用於後續迭代?後續調用可以使用OSR編譯的方法嗎?

看起來好像是這樣,一旦解釋器進入相同的字節碼索引,舊OSR啓動它就可以再次進入OSR編譯方法。

我問的主要是因爲我看到Hotspot立即OSR編譯我的方法兩次(對於不同的BCI),但甚至沒有執行正常的C2非OSR編譯,直到它已經運行幾分鐘的時間(儘管有一百萬次呼叫或更多的方法)。所以我想知道是否同時使用OSR C2方法(也有非OSR C1方法)?

回答

1

是的,它們可以重複使用。但是隻有在爲它們生成的同一個字節碼索引處,並且僅僅是爲了響應編譯策略的後向分支事件。

熱點InstanceKlass結構(Java類的內部表示)爲該類保留list of OSR methods。每當請求編譯時,CompileBroker looks for此列表中的現有NMethod。

我無法詳細瞭解您的特定情況,但從給出的描述中,我懷疑您的應用程序調用C1編譯版本。方法的入口點永遠不會設置爲OSR編譯的NMethod。

+0

是的,最後我沒有重現它 - 後來運行的主要是顯示熱啓動方法在啓動後一秒鐘左右就可以編譯正常的非OSR C2(級別4),所以我不確定是什麼起牀了。也許這是LogCompilation輸出中的一個小故障(例如,由PrintAssembly併發地寫入?),因爲_timing_似乎表明它正在運行OK。 – BeeOnRope

+0

你的意思是「在相同的字節碼**索引**上面爲...生成」嗎? – BeeOnRope

+0

@BeeOnRope是的,謝謝你的糾正。 – apangin

相關問題