一爵嗅、 JVM 簡單結(jié)構(gòu)圖
1.1 類加載子系統(tǒng)與方法區(qū)
? ??????類加載子系統(tǒng)負(fù)責(zé)從文件系統(tǒng)或網(wǎng)絡(luò)中加載Class 信息吃媒,加載的類信息存放于一塊稱作方法區(qū)的內(nèi)存空間烙如。除了類信息外涂籽,方法區(qū)中可能還會存放運行時常量池信息苹祟,包括字符字面量和數(shù)字常量
1.2? JAVA堆
????????Java 堆在虛擬機(jī)啟動的時候建立,它是 Java 程序最主要的內(nèi)存工作區(qū)域。幾乎所有的 JAVA 對象實例 都存放在 JAVA 堆中树枫。堆空間十分所有線程共享的直焙,這是一塊與 JAVA 應(yīng)用密切相關(guān)的內(nèi)存空間。
1.3? 直接內(nèi)存
????????Java 的 NIO 庫允許 Java 程序使用直接內(nèi)存砂轻,直接內(nèi)存是在 Java 堆外的奔誓,直接向系統(tǒng)申請的內(nèi)存空間。通常訪問直接內(nèi)存的速度會優(yōu)于 Java 堆搔涝。 因此處于性能考慮厨喂,讀寫頻繁的場合會考慮使用直接內(nèi)存。由于直接內(nèi)存在 Java 堆 外庄呈,因此它的大小不會直接受限于 Xmx 指定的最大堆大小蜕煌,但是系統(tǒng)內(nèi)存是有限的,Java 堆和直接內(nèi)存的總和依然受限于操作系統(tǒng)能給出的最大內(nèi)存诬留。
1.4? 垃圾回收系統(tǒng)
????????垃圾回收系統(tǒng)是 Java 虛擬機(jī)的重要組成部分斜纪,垃圾回收器可以對方法區(qū)、Java 堆和直接內(nèi)存進(jìn)行回收文兑。其中盒刚,Java 堆是垃圾收集器的工作重點。和 C / C++ 不同绿贞,Java 中所有對象空間釋放都是隱式的伪冰,也就是說,Java 中沒有類似 free() 或者 delete() 這樣的函數(shù)釋放指定內(nèi)存區(qū)域樟蠕。對于不再使用的垃圾對象贮聂,垃圾回收系統(tǒng)會在后臺默默的工作,默默查找寨辩、標(biāo)識并釋放垃圾對象吓懈,完成包括 Java 堆 、方法區(qū)和直接內(nèi)存中的全自動化管理
1.5? Java 棧
????????每一個 Java 虛擬機(jī)線程都有一個私有的 Java 棧靡狞,一個線程的 Java 棧在線程創(chuàng)建的時候被創(chuàng)建耻警,Java 棧中保存著幀信息,Java 棧中保存著局部變量甸怕、方法參數(shù)甘穿,同時和 Java 方法的調(diào)用、返回密切相關(guān)梢杭。
1.6? 本地方法棧
????????本地方法棧和 Java 棧非常相似温兼,最大的不同在于 java 棧用于方法的調(diào)用,而本地方法棧則用于本地方法的調(diào)用武契,作為對 Java 虛擬機(jī)的重要拓展募判,Java 虛擬機(jī)允許 Java 直接調(diào)用本地方法(通常使用 C 編寫)
1.7? PC寄存器
????????PC(Program Counter)寄存器也是每一個線程私有的空間荡含,Java 虛擬機(jī)會為每一個 java 線程創(chuàng)建 PC 寄存器。在任意時刻届垫,一個 Java 線程總是在執(zhí)行一個方法释液,這個正在被執(zhí)行的方法稱為當(dāng)前方法。如果當(dāng)前方法不是本地方法装处,PC 寄存器就會指向當(dāng)前正在被執(zhí)行的指令误债,如果當(dāng)前方法是本地方法,那么 PC 寄存器的值就是undefined
1.8? 執(zhí)行引擎
????????執(zhí)行引擎是 java 虛擬機(jī)最核心的組件之一妄迁,它負(fù)責(zé)執(zhí)行虛擬機(jī)的字節(jié)碼寝蹈,現(xiàn)代虛擬機(jī)為了提高執(zhí)行效率,會使用即時編譯(just in time)技術(shù)將方法編譯成機(jī)器碼后再執(zhí)行判族。
????????Java HostSpot Client VM(-client),為在客戶端環(huán)境中減少啟動時間兒優(yōu)化的執(zhí)行引擎项戴;本地應(yīng)用開發(fā)使用形帮。(如:eclipse)
????????Java HostSpot Server Vm(-server),為在服務(wù)器環(huán)境中最大化程序執(zhí)行速度而設(shè)計的執(zhí)行引擎周叮。應(yīng)用在服務(wù)端程序(如:Tomcat)
? ?Java HostSpot Client 模式和 Server 模式的區(qū)別
????????當(dāng)虛擬機(jī)運行在 -Client 模式的時候辩撑,使用的是一個代號 C1 的輕量級編譯器,而 -server 模式啟動的虛擬機(jī)采用相對重量級仿耽,代號為 C2 的編譯器合冀。C2 比 C1 編譯器編譯的相對徹底,服務(wù)起來之后性能更高项贺。
????????JDK 安裝目錄/jre/lib/(x86君躺、i386、amd32开缎、amd64)/jvm.cfg
????????文件中的內(nèi)容棕叫,-server 和-client 哪一個配置在上,執(zhí)行引擎就是哪一個奕删。如果是 JDK1.5 版本且是 64 位系統(tǒng)應(yīng)用時俺泣,-client 無效。
????--64 位系統(tǒng)內(nèi)容
????????-server KNOWN
????????-client IGNORE
????--32 位系統(tǒng)內(nèi)容
????????-server KNOWN
????????-client KNOWN
注意:在部分 JDK1.6 版本和后續(xù)的 JDK 版本(64 位系統(tǒng))中完残,-client 參數(shù)已經(jīng)不起作用 了伏钠,Server 模式成為唯一。