关于JVM和JIT的一点点
如您所知,JVM(Java Virtusal Machine)使Java能夠遵循“一次寫入,隨處運行”的范例。 JVM的核心包括以下組件:
- 堆
- 堆
- PermGen和方法區(qū)域
- JIT編譯器
- 代碼緩存
堆是在應(yīng)用程序代碼開發(fā)階段為您使用的每個新運算符分配內(nèi)存的位置。 堆棧將存儲您將在方法范圍內(nèi)分配的局部變量。 需要注意的一件事是,在方法范圍內(nèi)定義的變量將在方法完成后刪除。 例如,如果在方法范圍內(nèi)分配了字符串,并且保證其范圍是本地范圍,則它將存儲在堆棧中,否則將在堆中分配。 
PermGen空間將存儲類和方法級別的數(shù)據(jù)以及在應(yīng)用程序中定義的靜態(tài)變量。 方法區(qū)域?qū)嶋H上是PermGen空間中的一個區(qū)域,它將存儲您的應(yīng)用程序的所有方法,字段,恒定池級別的詳細信息。
JIT編譯器和代碼緩存并存。 JVM的核心是在運行時將Java字節(jié)碼解釋為匯編代碼。 解釋可能是一個緩慢的過程,因為每次執(zhí)行部分應(yīng)用程序代碼時,都需要在運行時將代碼從字節(jié)碼轉(zhuǎn)換為機器碼。 這就是JIT編譯器起作用的地方,它的方法超級棒,然后將其存儲在代碼緩存中。
JIT編譯器在運行時分析應(yīng)用程序代碼,以了解哪些方法可以歸類為熱門方法。 在這種情況下,“熱”表示代碼片段被更頻繁地訪問。 在很高的層次上,JIT編譯器所做的是為每個執(zhí)行的方法都有一個計數(shù)器,以了解其使用頻率。 當(dāng)計數(shù)器達到定義的閾值時,該方法將有資格由JIT編譯器編譯為其相應(yīng)的匯編代碼,然后將其存儲在代碼緩存中。 現(xiàn)在發(fā)生的事情是,每當(dāng)JIT編譯器遇到對那些已編譯并存儲在代碼緩存中的方法的調(diào)用時,它都不會嘗試再次解釋它們,而是將使用代碼緩存內(nèi)可用的已編譯匯編代碼。 這可以提高應(yīng)用程序的性能,因為使用編譯后的代碼比在運行時對其進行解釋要快得多。
在談?wù)揓IT編譯器時,主要有兩種風(fēng)格,由于缺乏相關(guān)文檔,我們幾乎忽略了它們。 這兩種類型是:
- 客戶
- 服務(wù)器
使用的默認編譯器將根據(jù)您所運行的計算機體系結(jié)構(gòu)和JVM版本(32位或64位)而有所不同。 讓我們簡要地看看每個人的工作。
客戶端編譯器在應(yīng)用程序啟動時開始將字節(jié)代碼編譯為匯編代碼。 這間接意味著您的應(yīng)用程序的啟動時間將大大縮短。 但是,這帶來的主要缺點是代碼緩存將更快地耗盡內(nèi)存。 只有在您的應(yīng)用程序運行了很短的時間后,才能進行大多數(shù)優(yōu)化。 但是由于客戶端編譯器已經(jīng)占用了代碼緩存空間,因此您將沒有空間來存儲用于這些優(yōu)化的匯編代碼。 這就是服務(wù)器緩存出色的地方。
與客戶端編譯器不同,服務(wù)器編譯器不會在應(yīng)用程序開始時開始編譯。 它將允許應(yīng)用程序代碼運行一段時間(通常稱為預(yù)熱期),此后它將開始將字節(jié)碼編譯為匯編代碼,然后將其存儲在代碼緩存中。
在我的下一篇文章中,我將討論如何真正地混合和匹配客戶端和服務(wù)器的編譯,并向您介紹一些我們很少遇到但對于提高應(yīng)用程序性能至關(guān)重要的JVM標(biāo)志。
翻譯自: https://www.javacodegeeks.com/2014/06/a-little-bit-on-the-jvm-and-jit.html
總結(jié)
以上是生活随笔為你收集整理的关于JVM和JIT的一点点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 电信光宽带怎么设置路由器(电信光宽带怎么
- 下一篇: 鸿鹄专业电脑(鸿鹄处理器)
