- 實戰(zhàn)Java虛擬機:JVM故障診斷與性能優(yōu)化(第2版)
- 葛一鳴
- 991字
- 2024-01-08 16:10:54
2.1 謀全局者才能成大器:看穿Java虛擬機的架構(gòu)
Java虛擬機的基本結(jié)構(gòu)如圖2.1所示。

圖2.1 Java虛擬機的基本結(jié)構(gòu)
類加載子系統(tǒng)負責從文件系統(tǒng)或者網(wǎng)絡(luò)中加載Class信息,加載的類信息存放于一塊稱為方法區(qū)的內(nèi)存空間中。除了類的信息,方法區(qū)中可能還會存放運行時常量池信息,包括字符串字面量和數(shù)字常量(這部分常量信息是Class文件中常量池部分的內(nèi)存映射)。
Java堆在虛擬機啟動的時候建立,它是Java程序最主要的內(nèi)存工作區(qū)域。幾乎所有的Java對象實例都存放于Java堆中。堆空間是所有線程共享的,這是一塊與Java應(yīng)用密切相關(guān)的內(nèi)存區(qū)域。
Java的NIO庫允許Java程序使用直接內(nèi)存。直接內(nèi)存是在Java堆外的、直接向系統(tǒng)申請的內(nèi)存區(qū)域。通常,訪問直接內(nèi)存的速度會優(yōu)于Java堆。因此,出于性能考慮,讀寫頻繁的場合可能會考慮使用直接內(nèi)存。由于直接內(nèi)存在Java堆外,因此,它的大小不會直接受限于Xmx指定的最大堆大小,但是系統(tǒng)內(nèi)存是有限的,Java堆和直接內(nèi)存的總和依然受限于操作系統(tǒng)的最大內(nèi)存。
垃圾回收系統(tǒng)是Java虛擬機的重要組成部分,垃圾回收器可以對方法區(qū)、Java堆和直接內(nèi)存進行回收。其中,Java堆是垃圾收集器的工作重點。和C/C++不同,Java中所有的對象空間釋放都是隱式的。也就是說,Java中沒有類似free()或者delete()這樣的函數(shù)釋放指定的內(nèi)存區(qū)域。對于不再使用的垃圾對象,垃圾回收系統(tǒng)會在后臺默默工作,默默查找、標識并釋放垃圾對象,完成包括Java堆、方法區(qū)和直接內(nèi)存中的全自動化管理。有關(guān)垃圾回收系統(tǒng)的更多信息,可以參閱第4章和第5章。
每一個Java虛擬機線程都有一個私有的Java棧。一個線程的Java棧在線程創(chuàng)建的時候被創(chuàng)建。Java棧中保存著幀信息(參閱2.4節(jié)),Java棧中保存著局部變量、方法參數(shù),同時和Java方法的調(diào)用、返回密切相關(guān)。
本地方法棧和Java棧非常類似,最大的不同在于Java棧用于Java方法的調(diào)用,而本地方法棧則用于本地方法的調(diào)用。作為對Java虛擬機的重要擴展,Java虛擬機允許Java直接調(diào)用本地方法(通常使用C語言編寫)。
PC(Program Counter)寄存器也是每個線程私有的空間,Java虛擬機會為每一個Java線程創(chuàng)建PC寄存器。在任意時刻,一個Java線程總是在執(zhí)行一個方法,這個正在被執(zhí)行的方法稱為當前方法。如果當前方法不是本地方法,PC寄存器就會指向當前正在被執(zhí)行的指令。如果當前方法是本地方法,那么PC寄存器的值就是undefined。
執(zhí)行引擎是Java虛擬機的最核心組件之一,它負責執(zhí)行虛擬機的字節(jié)碼。現(xiàn)代虛擬機為了提高執(zhí)行效率,會使用即時編譯技術(shù)將方法編譯成機器碼后再執(zhí)行。執(zhí)行引擎的進一步描述可以參閱第11章。
- 經(jīng)·理@互聯(lián)網(wǎng)產(chǎn)品經(jīng)理的進階修煉
- 軟件工程理論與應(yīng)用
- 產(chǎn)品眾包設(shè)計理論與方法
- 數(shù)據(jù)科學導論:Python語言實現(xiàn)
- 程序員度量:改善軟件團隊的分析學
- Verilog HDL數(shù)字系統(tǒng)設(shè)計及實踐
- 軟件質(zhì)量管理指南
- 從隱秩序到顯規(guī)則:工程體系基于V++規(guī)則引擎的生態(tài)演進
- 中國軟件工程師:工作、生活與觀念
- 軟件單元測試
- 瘋狂Java:突破程序員基本功的16課(修訂版)
- Scrum捷徑:敏捷策略、工具與技巧
- 鋒利的jQuery(第2版)
- R實戰(zhàn):系統(tǒng)發(fā)育樹的數(shù)據(jù)集成操作及可視化
- 企業(yè)級DevOps應(yīng)用實戰(zhàn):基于GitLab CI/CD和云原生技術(shù)