您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“怎么優(yōu)化JIT”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
JIT 是 just in time 的縮寫, 也就是即時編譯編譯器。
在運行時 JIT 會把翻譯過的機器碼保存起來,以備下次使用,因此從理論上來說,采用該 JIT 技術(shù)可以接近以前純編譯技術(shù)。下面我們看看,JIT 的工作過程。
備注:寄存器的使用是編譯器的一個非常普遍的優(yōu)化。寄存器的速度比主存快很多。
初級調(diào)優(yōu):客戶模式或服務(wù)器模式
中級編譯器調(diào)優(yōu) (-cient,-server 或是-xx:+TieredCompilation)
優(yōu)化代碼緩存 (–XX:ReservedCodeCacheSize)
編譯閾值 (-XX:CompileThreshold)
檢查編譯過程 (XX:+PrintCompilation)
高級編譯器調(diào)優(yōu)
編譯線程 (-XX:CICompilerCount)
從優(yōu)化的角度講,最簡單的選擇就是使用 server 編譯器的分層編譯技術(shù),這將解決大約 90%左右的與編譯器直接相關(guān)的性能問題。最后,請保證代碼緩存的大小設(shè)置的足夠大,這樣編譯器將會提供最高的編譯性能。
HotSpot中有編譯器和解釋器并存。
HotSpot中內(nèi)置兩個JIT編譯器:
JVM根據(jù)自身版本和機器硬件性能自動選擇
Client Compiler,簡稱C1,-client參數(shù)強制
Server Compiler,簡稱C2, -server參數(shù)強制
解釋器和編譯器搭配使用成為混合模式(Mixed Mode)
用-Xint參數(shù)強制JVM運行與解釋模式,全部用解釋方式,編譯器不介入
用-Xcomp強制JVM運行于編譯模式,優(yōu)先采用編譯方式
分層編譯:根據(jù)比那一起編譯,優(yōu)化的規(guī)模耗時,劃分出不同的編譯層次
第0層,程序解釋執(zhí)行,解釋器不開啟性能監(jiān)測功能,觸發(fā)第一層編譯
第1層,也叫C1編譯,將字節(jié)碼編譯為本地代碼,進行簡單, 可靠的優(yōu)化,如有必要,加入性能監(jiān)測的邏輯
第2層(或者2層以上),也叫C2編譯,將字節(jié)碼比那一位本地代碼,但會開啟一些編譯耗時較長的優(yōu)化,甚至根據(jù)性能監(jiān)控信息進行一些不可靠的激進優(yōu)化
分層編譯后,Client Compiler和Server Compiler將會同時工作,代碼可能會被多次編譯,用Client獲得更高的編譯速度,用Server獲得更好的編譯質(zhì)量,解釋執(zhí)行的時候無需搜集性能監(jiān)控信息
熱點代碼有兩類:
多次調(diào)用的方法
多次執(zhí)行的循環(huán)體,實際上也會以整個方法作為編譯對象
判斷熱點的方法主要有兩種:
基于采樣的熱點探測(Sample Based Hot Spot Detection):周期性檢查各個線程的棧頂,發(fā)現(xiàn)某個(某些)方法經(jīng)常出現(xiàn)在棧頂,就是熱點方法 有點簡單高效,可以獲取方法調(diào)用關(guān)系(將調(diào)用堆棧展開即可) 缺點是很難精確確認(rèn)方法熱度,容易受到線程阻塞等外界因素影響 基于計數(shù)器的熱點探測(Counter Based Hot Spot Detection):為每個方法(甚至代碼塊)建立計數(shù)器,統(tǒng)計方法調(diào)用次數(shù),如果執(zhí)行超過閾值就認(rèn)為是熱點方法。缺點是實現(xiàn)較為困難。優(yōu)點是結(jié)果更精確。
基于計數(shù)器的探測: Client模式下默認(rèn)1500次,Server下默認(rèn)10000次,根據(jù)參數(shù)-XX:CompileThreshold設(shè)定。 調(diào)用一個方法,先檢查是否存在JIT編譯版本本地代碼,存在優(yōu)先使用本地代碼,不存在將計數(shù)器加1。然后判斷調(diào)用計數(shù)器和回邊計數(shù)器之和是否大于閾值,如果超過,用JIT編譯器提交編譯請求。JIT編譯完成后方法調(diào)用入口就被系統(tǒng)換成新的。下次調(diào)用已編譯版本。 計數(shù)器熱度衰減(Counter Decay超過一定的時間限度,方法的調(diào)用次數(shù)仍未達到閾值,方法計數(shù)器減少一半。在垃圾收集期間執(zhí)行,用-UseCounterDecay來關(guān)閉,以統(tǒng)計絕對次數(shù)。用-XX:CounterHalfLifeTime設(shè)置半半衰周期。 回邊計數(shù)器:統(tǒng)計方法中方法體代碼執(zhí)行的次數(shù),在字節(jié)碼中遇到控制流向后跳動的指令成為回邊(Back Edge)。 回邊計數(shù)器閾值可以用-XX:OnStackReplacePercentage來間接調(diào)整。 回邊計數(shù)器沒有熱度衰減過程。
JVM默認(rèn)情況下對于即時編譯請求在編譯完成之前,都按照解釋方式執(zhí)行,編譯動作在后臺線程執(zhí)行
參數(shù)-XX:-BackgroundCompilation禁止后臺編譯,此時編譯請求會等待,直到編譯完成后直接執(zhí)行本地代碼
Client Compiler:關(guān)注局部優(yōu)化,簡單快速,放棄耗時的長時優(yōu)化
Server Compiler:面向服務(wù)端,高性能,復(fù)雜,較緩慢
“怎么優(yōu)化JIT”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。