博客主机
A-A+

JIT(Just-In-Time)編譯器

2008年10月24日 柴房 暂无评论

JIT(Just-In-Time)編譯器

用來提高應用程序性能的最簡單的工具是Just-In-Time(JIT)實時編譯器。JIT是一個可將Java字節碼轉換為本地機器碼的代碼生成器。由JIT調用的Java程序,其運行速度通常要比由解釋程序執行字節碼時的速度高得多。
JIT編譯器首先是在Java開發工具包(JDK™)1.1.6中作為一種性能更新出現的,而現在它是你在Java 2平台上使用Java解釋程序命令時調用的標準工具。你可以使用Java虛擬機的-Djava.compiler=NONE 選項來使JIT編譯器失效,這在JIT的末尾部分有更詳細的闡述。

JIT編譯器是如何工作的?

JIT編譯器是作為一種依賴於平台的本地庫提供的。如果JIT編譯器庫存在,則Java虛擬機將初始化Java本地接口(JNI)的本地代碼分支以調用在該庫中可獲得的JIT函數,而不是調用在解釋程序中的相應函數。

java.lang.Compiler 類被用來加載本地庫並啟動JIT編譯器內的初始化。當Java虛擬機調用一個Java方法時,它使用在加載的類對象的方法塊中所指定的調用 (invoker)方法。Java虛擬機具有若干個調用者方法,例如,如果方法是同步的,或者它是一個本地方法,則將使用不同的調用者。JIT編譯器使用 它自己的調用者。Sun的產品可以為值ACC_MACHINE_COMPILED檢查方法存取位以告知解釋程序該方法的代碼已被編譯並存儲在加載類中。

代碼何時成為JIT編譯的代碼?

當一個方法被首次調用時,JIT編譯器為該方法將方法塊編譯為本地代碼,並將其存儲在該方法的代碼塊中。
一旦代碼被編譯完成,在Sun平台上所使用的ACC_MACHINE_COMPILED的位則被設定。

如何使用JIT來發揮你的優勢

首先要記住的一點是,JIT編譯器在第二次調用一個方法時,會獲得大部分速度上的改善。JIT編譯器的確是編譯了整個方法,而不是對其進行逐行解 釋,逐行解釋也是一種在運行一個可執行JIT的應用程序時用以改善性能的途徑。這意味著如果代碼僅被調用一次,你將不會看到太大的性能改善。JIT編譯器 也將忽略構造函數(class constructor),所以,如果可能的話,應最少量地保留構造函數代碼。
如果不能預先檢查某些Java邊界條件,JIT編譯器也不能獲得最大的性能改善,這些邊界條件包括零指針(Null pointer)或邊界外數組等異常。JIT編譯器能夠知道出現零指針異常的唯一途徑是通過由操作系統所提供的信號。由於該信號來自操作系統,而不是來自 Java虛擬機,因而你的程序會出現性能上的干擾。為了保證在用JIT運行一個應用程序時,能夠獲取最好的性能,應確保你的代碼完全沒有像零指針或邊界外 數組那樣的異常。

标签:

给我留言

Copyright © 小小的数据技术梦想 保留所有权利.   Theme  Ality 浙ICP备12043346号-1

用户登录

分享到: