jit即时编译_热点中的即时编译器(JIT)
jit即時編譯
即時編譯器(JIT)的概念以及更廣泛的自適應優化是除Java(.Net,Lua,JRuby)之外的許多語言中眾所周知的概念。為了解釋什么是JIT編譯器,我想先定義一個編譯器概念。 根據維基百科,編譯器是“將源語言轉換為另一種計算機語言(目標語言)的計算機程序”。
我們都熟悉靜態Java編譯器(javac),該程序將人類可讀的.java文件編譯為可以由JVM解釋的字節碼– .class文件。 那么,JIT編譯什么? 在解釋什么是“及時”之后,稍后會給出答案。
根據大多數研究,執行時間的80%用于執行20%的代碼。 如果有一種方法可以確定那20%的代碼并對其進行優化,那就太好了。 這正是JIT所做的–在運行時,它收集統計信息,找到“熱”代碼,將其從JVM解釋的字節碼(存儲在.class文件中)編譯為由操作系統直接執行的本機代碼,并對其進行大量優化。 最小的編譯單位是單一方法。 編譯和統計信息收集是通過特殊線程與程序執行并行進行的。 在收集統計信息期間,編譯器對代碼功能進行假設,隨著時間的流逝,嘗試證明或反證它們。 如果假設不成立,則將對代碼進行優化,然后再次重新編譯。
之所以選擇Sun(Oracle)JVM的“熱點”,是因為該虛擬機能夠在代碼中找到“熱點”。
JIT有哪些優化?
讓我們仔細看看JIT所做的更多優化。
- 內聯方法–而不是在對象實例上調用方法,而是將方法復制到調用者代碼。 熱方法應盡可能靠近調用者,以防止任何開銷。
- 如果無法從其他線程訪問監視器,則消除鎖定
- 用直接方法調用替換接口,以實現僅實現一次的方法,以消除對虛擬函數的調用
- 在同一對象上連接相鄰的synchronized塊
- 消除無效代碼
- 對非易失volatile變量的直接存儲器寫操作
- 刪除預檢查的NullPointerException和IndexOutOfBoundsException
- 等等
Java VM調用Java方法時,它將使用已加載的類對象的方法塊中指定的調用者方法。 Java VM具有多個調用程序方法,例如,如果該方法是同步的或本機方法,則使用不同的調用程序。 JIT編譯器使用其自己的調用程序。 Sun生產發行版檢查方法訪問位的值ACC_MACHINE_COMPILED,以通知解釋器該方法的代碼已經編譯并存儲在裝入的類中。 JIT編譯器將方法塊編譯為該方法的本機代碼,并將其存儲在該方法的代碼塊中。 編譯代碼后,將設置Sun平臺上使用的ACC_MACHINE_COMPILED位。 我們如何知道JIT在程序中正在做什么以及如何對其進行控制?
首先禁用JIT可以使用Djava.compiler = NONE參數。
Hotspot中有兩種類型的JIT編譯器–一種用于客戶端程序,一種用于服務器(VM參數中的-server選項)。 在服務器上運行的程序通常比在客戶端上運行的程序享有更多的資源,并且對服務器來說,程序的最高吞吐量通常更為重要。 因此,服務器中的JIT會消耗更多資源,并且收集統計信息會花費更多時間來使統計信息更加準確。 對于客戶端程序,方法的靜態收集持續1500個方法調用,對于服務器15000??梢酝ㄟ^– XX:CompileThreshold = XXX VM參數更改這些默認值。
為了找出默認值是否適合您,請嘗試啟用“ XX:+ PrintCompilation”和“ -XX:-CITime”參數,這些參數將打印JIT統計信息和JIT花費的時間。
基準測試
大多數基準測試表明,JIT代碼的運行速度比解釋代碼快10至20倍。 完成了許多基準測試。 下面給出了其中兩個的結果圖:
值得一提的是,以JIT模式運行但仍處于“學習模式”的程序比非JITed程序運行慢得多。
準時制的缺點
JIT增加Java程序中不可預測性和復雜性的水平。 它增加了開發人員并不真正理解的另一層。 可能的錯誤示例-并發中的“關系發生前”。 如果更改對于在單線程中運行的程序是安全的,則JIT可以輕松地對代碼重新排序。 為了解決此問題,開發人員使用“同步”字或顯式鎖定來提示JIT。 增加非堆內存占用量– JIT代碼存儲在“代碼緩存”生成中。
先進的準時制
JIT和垃圾回收。
- 要使GC發生,程序必須達到安全點。 為此,JIT定期在本機代碼中插入屈服點。
- 除了掃描堆棧以查找根引用外,還必須掃描寄存器,因為它們可能包含JIT創建的對象
參考: The Art of Java博客中我們的JCG合作伙伴 Art Gourevitch 在Hotspot中提供的Just in Time Compiler(JIT) 。
翻譯自: https://www.javacodegeeks.com/2012/06/just-in-time-compiler-jit-in-hotspot.html
jit即時編譯
總結
以上是生活随笔為你收集整理的jit即时编译_热点中的即时编译器(JIT)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓版掼蛋怎么没有好友房(安卓版掼蛋)
- 下一篇: openshift_通过OpenShif