什么是JIT
JIT 是 just in time 的縮寫, 也就是即時編譯編譯器,
在運行時 JIT 會把翻譯過的機器碼保存起來,以備下次使用,因此從理論上來說,采用該 JIT 技術可以接近以前純編譯技術,下面我們看看,JIT 的作業程序,

備注:暫存器的使用是編譯器的一個非常普遍的優化,暫存器的速度比主存快很多,
怎么優化JIT編譯
- 初級調優:客戶模式或服務器模式
- 中級編譯器調優 (-cient,-server 或是-xx:+TieredCompilation)
- 優化代碼快取 (–XX:ReservedCodeCacheSize)
- 編譯閾值 (-XX:CompileThreshold)
- 檢查編譯程序 (XX:+PrintCompilation)
- 高級編譯器調優
- 編譯執行緒 (-XX:CICompilerCount)
從優化的角度講,最簡單的選擇就是使用 server 編譯器的分層編譯技術,這將解決大約 90%左右的與編譯器直接相關的性能問題,最后,請保證代碼快取的大小設定的足夠大,這樣編譯器將會提供最高的編譯性能,
HotSpot中的JIT編譯器
1.1 編譯器和解釋器
HotSpot中有編譯器和解釋器并存,
HotSpot中內置兩個JIT編譯器:
JVM根據自身版本和機器硬體性能自動選擇
- Client Compiler,簡稱C1,-client引數強制
- Server Compiler,簡稱C2, -server引數強制
解釋器和編譯器搭配使用成為混合模式(Mixed Mode)
- 用-Xint引數強制JVM運行與解釋模式,全部用解釋方式,編譯器不介入
- 用-Xcomp強制JVM運行于編譯模式,優先采用編譯方式
分層編譯:根據比那一起編譯,優化的規模耗時,劃分出不同的編譯層次
- 第0層,程式解釋執行,解釋器不開啟性能監測功能,觸發第一層編譯
- 第1層,也叫C1編譯,將位元組碼編譯為本地代碼,進行簡單, 可靠的優化,如有必要,加入性能監測的邏輯
- 第2層(或者2層以上),也叫C2編譯,將位元組碼比那一位本地代碼,但會開啟一些編譯耗時較長的優化,甚至根據性能監控資訊進行一些不可靠的激進優化
分層編譯后,Client Compiler和Server Compiler將會同時作業,代碼可能會被多次編譯,用Client獲得更高的編譯速度,用Server獲得更好的編譯質量,解釋執行的時候無需搜集性能監控資訊
1.2 編譯物件和觸發條件
熱點代碼有兩類:
- 多次呼叫的方法
- 多次執行的回圈體,實際上也會以整個方法作為編譯物件
判斷熱點的方法主要有兩種:
基于采樣的熱點探測(Sample Based Hot Spot Detection):周期性檢查各個執行緒的堆疊頂,發現某個(某些)方法經常出現在堆疊頂,就是熱點方法
有點簡單高效,可以獲取方法呼叫關系(將呼叫堆疊展開即可)
缺點是很難精確確認方法熱度,容易受到執行緒阻塞等外界因素影響
基于計數器的熱點探測(Counter Based Hot Spot Detection):為每個方法(甚至代碼塊)建立計數器,統計方法呼叫次數,如果執行超過閾值就認為是熱點方法,缺點是實作較為困難,優點是結果更精確,
基于計數器的探測:
Client模式下默認1500次,Server下默認10000次,根據引數-XX:CompileThreshold設定,
呼叫一個方法,先檢查是否存在JIT編譯版本本地代碼,存在優先使用本地代碼,不存在將計數器加1,然后判斷呼叫計數器和回邊計數器之和是否大于閾值,如果超過,用JIT編譯器提交編譯請求,JIT編譯完成后方法呼叫入口就被系統換成新的,下次呼叫已編譯版本,
計數器熱度衰減(Counter Decay超過一定的時間限度,方法的呼叫次數仍未達到閾值,方法計數器減少一半,在垃圾收集期間執行,用-UseCounterDecay來關閉,以統計絕對次數,用-XX:CounterHalfLifeTime設定半半衰周期,
回邊計數器:統計方法中方法體代碼執行的次數,在位元組碼中遇到控制流向后跳動的指令成為回邊(Back Edge),
回邊計數器閾值可以用-XX:OnStackReplacePercentage來間接調整,
回邊計數器沒有熱度衰減程序,
1.3 編譯程序
JVM默認情況下對于即時編譯請求在編譯完成之前,都按照解釋方式執行,編譯動作在后臺執行緒執行
引數-XX:-BackgroundCompilation禁止后臺編譯,此時編譯請求會等待,直到編譯完成后直接執行本地代碼
- Client Compiler:關注區域優化,簡單快速,放棄耗時的長時優化
- Server Compiler:面向服務端,高性能,復雜,較緩慢
本文由猿必過 YBG 發布
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264062.html
標籤:Java
