2011-10-21 53 views
14

在關於熱點JIT的講座中,我想盡可能多地提供JIT執行的特定優化的示例。熱點JIT優化

我知道的只是「方法內聯」,但應該有更多。爲每個例子投票。

回答

13

那麼,你應該掃描Brian Goetz的文章作爲例子。

簡言之,熱點可以和將:

  1. 內聯方法
  2. 加入在同一對象上相鄰​​塊
  3. 消除鎖如果顯示器不能從其他線程到達
  4. 消除死代碼(因此大多數微基準是無意義的)
  5. 刪除內存寫入非volatile變量
  6. 更換接口調用與直接法要求只執行一次方法

等等

2

跳轉到等效的本機機器碼,而不是JVM對操作碼的解釋。對於Java應用程序的高度使用部分(這相當於JVM的擴展),機器代碼中不需要模擬機器(JVM),可以提高速度。

當然,這是HotSpot的大部分。

4

this article有一箇舊的,但可能仍然有效的概述。

亮點似乎基於可用的運行時分析信息,以表演古典優化:

  • JITting「熱點」爲本地代碼
  • 自適應內聯 - 內聯最常調用實現對某個方法分派以避免龐大的代碼大小

而一些次要的代碼,如分配短生命的對象更便宜,以及各種其他較小的優化,再加上任何其他廣告自該文章發表以來。

還有一個更詳細的official whitepaper,和一個相當基本事實HotSpot Internals wiki page,其中列出瞭如何編寫快速Java代碼應該讓你推斷什麼用例進行了優化。

7

我認爲有趣的東西是常規編譯器無法做到的與JIT相反的事情。內聯方法,消除死代碼,CSE,實時分析等。都是由你的普通C++編譯器完成的,在這裏沒有什麼「特別的」

但是基於樂觀的假設優化某些東西,然後如果它們最終會錯誤的時候去優化呢? (假設一個特定的類型,刪除分支,如果沒有完成,將會失敗,以後無論如何......)如果我們可以保證現在只存在一個類,那麼刪除虛擬調用(又是隻能可靠地與去最優化一起工作的東西)?自適應優化是我認爲真正區分JIT和運行C++編譯器的一件事。

也許還會提到由JIT完成的運行時概要分析,以分析應該應用哪種優化(儘管如此,並非所有配置文件指導的優化都是唯一的)。