官术网_书友最值得收藏!

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章。

主站蜘蛛池模板: 建德市| 永胜县| 城市| 曲松县| 龙岩市| 景德镇市| 丰都县| 乐都县| 巴林左旗| 湖口县| 波密县| 来宾市| 岐山县| 南昌县| 兴国县| 溧阳市| 和田市| 讷河市| 无锡市| 宜兰县| 衢州市| 道真| 庆安县| 尖扎县| 荣成市| 禄劝| 攀枝花市| 张北县| 滕州市| 徐汇区| 乐山市| 同心县| 灵璧县| 文成县| 宁南县| 宝丰县| 蚌埠市| 疏勒县| 霍州市| 临潭县| 胶州市|