2012-02-02 76 views
28

他們兩人差不多都做同樣的事情。確定方法很熱並編譯它而不是解釋。使用OSR時,只需在編譯後的版本移動到編譯版本,與JIT不同,在JIT中編譯後的代碼在第二次調用方法時被調用。即時編譯和堆棧替換之間的差異

除此之外,還有其他區別嗎?

+4

谷歌或維基百科都不能告訴我OSR是什麼。 – 2012-02-02 00:31:45

+3

@MaurícioLinhares谷歌告訴我,這是在堆棧更換。 – 2012-02-02 00:33:22

+0

這個博客是另一個很好的資源...... http://www.azulsystems.com/blog/cliff/2011-11-22-what-the-heck-is-osr-and-why-is-it-bad-或很好 – 2012-02-02 04:23:02

回答

42

一般而言,即時編譯編譯是指在運行時編譯本機代碼並執行它,而不是解釋(或除解釋之外)。一些虛擬機,如Google V8,甚至沒有口譯員;他們JIT編譯每個被執行的函數(具有不同程度的優化)。

堆棧替換(OSR)是一種用於在同一功能的不同實現之間進行切換的技術。例如,您可以在完成編譯後立即使用OSR從解釋或未優化的代碼切換到JIT代碼。

當您在運行時將功能標識爲「熱門」時,OSR非常有用。這可能不一定是因爲函數被頻繁調用;它可能只被調用一次,但它花費了大量的時間在一個可以從優化中受益的大循環中。發生OSR時,虛擬機暫停,目標功能的堆棧幀被替換爲可能在不同位置具有變量的等效幀。

OSR也可能發生在另一個方向上:從優化代碼到未優化代碼或解釋代碼。優化的代碼可能會根據過去的行爲對程序的運行時行爲做出一些假設。例如,如果您只見過一種類型的接收器對象,則可以將虛擬或動態方法調用轉換爲靜態調用。如果後來證明這些假設是錯誤的,則可以使用OSR回到更保守的實現:優化的堆棧幀被轉換爲未優化的堆棧幀。如果VM支持內聯,您甚至可能會將優化的堆棧幀轉換爲幾個未優化的堆棧幀。

8

是的,就是這麼多。 Just-in-time compilation可以通過編譯字節碼的「熱點」(已知/應該經常執行的字節碼點)到本機指令來提高性能。 On-Stack Replacement補充了JIT功能,通過在編譯版本變得可用時將長期運行的解釋「熱」字節碼替換掉。上述On-Stack Replacement article顯示了一個很好的例子,其中JIT編譯在沒有OSR的情況下不會非常有用。

+4

不幸的是,文章鏈接不起作用了。這是OSR上的另一篇文章:http://xmlandmore.blogspot.com/2012/06/on-stack-replacement-in-hotspot-jvm.html – Tvaroh 2013-05-08 12:49:00

2

人們已經提到什麼是JIT。

堆棧上替換(OSR)

當JVM執行的Java方法時,它檢查該方法已被調用的次數的總和,和的次數在任何循環該方法已分支並決定該方法是否適合編譯。如果是,則該方法排隊編譯。這種編譯沒有正式名稱,但通常稱爲標準 彙編。

但是如果該方法有一個很長的循環或者從不退出並提供程序的所有邏輯呢?在這種情況下,JVM需要編譯循環,而不用等待 進行方法調用。因此,每當循環完成執行時,分支 計數器都會增加並檢查。如果分支計數器已經超過其個別的 閾值,那麼循環(而不是整個方法)就有資格編譯 。 這種編譯稱爲堆棧上替換(OSR),因爲即使環路 被編譯,這是不夠的:JVM已經有開始執行的的 編譯版本的功能當循環仍在運行時循環。當循環 的代碼已完成編譯時,JVM將替換代碼(堆棧中),並且在下一次迭代時,循環將執行速度更快的編譯版本。