JIT 编译器概述
Just-In-Time (JIT) 編譯器是 Java? Runtime Environment 的一個(gè)組件,用于提高運(yùn)行時(shí)的 Java 應(yīng)用程序的性能。
Java 程序由多個(gè)類組成,它包含可在許多不同計(jì)算機(jī)體系結(jié)構(gòu)上由 JVM 解釋的與平臺(tái)無關(guān)的字節(jié)碼。在運(yùn)行時(shí),JVM 裝入類文件,確定每個(gè)單獨(dú)的字節(jié)碼的語義,并執(zhí)行相應(yīng)的計(jì)算。解釋期間額外使用處理器和內(nèi)存意味著 Java 應(yīng)用程序的執(zhí)行速度要慢于本機(jī)應(yīng)用程序。JIT 編譯器通過在運(yùn)行時(shí)將字節(jié)碼編譯為本機(jī)代碼以幫助提高 Java 程序的性能。
JIT 編譯器在缺省情況下為已啟用,并在調(diào)用 Java 方法時(shí)被激活。JIT 編譯器將該方法的字節(jié)碼編譯為本機(jī)機(jī)器碼,“即時(shí)”編譯該代碼以便運(yùn)行。在編譯方法時(shí),JVM 直接調(diào)用該方法的已編譯代碼,而不是對代碼進(jìn)行解釋。理論上,如果編譯不需要占用處理器時(shí)間和內(nèi)存,那么編譯每個(gè)方法都可能使 Java 程序速度接近于本機(jī)應(yīng)用程序的速度。
JIT 編譯不需要占用處理器時(shí)間和內(nèi)存。在 JVM 首次啟動(dòng)時(shí),將調(diào)用數(shù)千種方法。即使程序最終實(shí)現(xiàn)了較高的峰值性能,編譯所有這些方法也會(huì)對啟動(dòng)時(shí)間產(chǎn)生顯著影響。
實(shí)際上,第一次調(diào)用方法時(shí)不會(huì)對方法進(jìn)行編譯。 對于每個(gè)方法,JVM 都會(huì)保留一個(gè)調(diào)用計(jì)數(shù),每次調(diào)用方法時(shí)該計(jì)數(shù)都將遞增。JVM 對方法進(jìn)行解釋,直至其調(diào)用計(jì)數(shù)超過 JIT 編譯閾值。因此,在 JVM 啟動(dòng)后將立即編譯常用方法,而在較長時(shí)間之后(或者根本不編譯)不常使用的方法。JIT 編譯閾值幫助 JVM 快速啟動(dòng)并且還可提高性能。 謹(jǐn)慎選擇閾值,以在啟動(dòng)時(shí)與長期性能之間實(shí)現(xiàn)最佳平衡。
在編譯方法后,調(diào)用計(jì)數(shù)將重置為 0,并且對該方法的后續(xù)調(diào)用將繼續(xù)使其計(jì)數(shù)遞增。在方法的調(diào)用計(jì)數(shù)到達(dá) JIT 重新編譯閾值時(shí),JIT 編譯器將執(zhí)行第二次編譯,與前一次編譯相比,其優(yōu)化選擇更多。此過程將重復(fù),直至到達(dá)最大優(yōu)化級(jí)別。Java 程序的最忙碌方法始終是最積極地進(jìn)行優(yōu)化,從而實(shí)現(xiàn)使用 JIT 編譯器的性能優(yōu)勢最大化。JIT 編譯器還可在運(yùn)行時(shí)度量運(yùn)作數(shù)據(jù),并使用該數(shù)據(jù)來提高進(jìn)一步重新編譯的質(zhì)量。
可禁用 JIT 編譯器,在這種情況下,將解釋整個(gè) Java 程序。除診斷或解決 JIT 編譯問題外,不推薦禁用 JIT 編譯器。
from:?https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_7.0.0/com.ibm.java.lnx.70.doc/diag/understanding/jit_overview.html?
總結(jié)
- 上一篇: 破坏双亲委派机制的那些事
- 下一篇: JBoss Modules 模块描述文件