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