引子

第三行有兩個(gè)單詞需要注意,第一個(gè)是HotSpot,第二個(gè)是Server。
- HotSpot
jvm的作用是將cpu看不懂的.class文件變成cpu看的懂的本地代碼。java每次在更新版本的時(shí)候,都需要對(duì)jvm進(jìn)行調(diào)優(yōu),如果jvm頻繁的對(duì).class文件進(jìn)行解析,將浪費(fèi)大量資源。所以,提出了一個(gè)比較好的辦法,那就是HopSpot(熱點(diǎn)追蹤),即對(duì)于一些解析非常頻繁的.class文件,直接保存它解析好的在本地,便不需要浪費(fèi)資源去頻繁解析了。 - Server
jvm有兩種模式,一種是Server,一種是Client。Server和Client模式可以在bin中進(jìn)行調(diào)換。他們的差別就是在jvm自動(dòng)分配內(nèi)存的時(shí)候,給Server分配的內(nèi)存要比Client大一些,Client主要是用于桌面應(yīng)用編程的,Server用于并發(fā)編程,所以需要的內(nèi)存要大一些。
jvm結(jié)構(gòu)

Java虛擬機(jī)的基本結(jié)構(gòu)
- 類加載子系統(tǒng)與方法區(qū)
類加載子系統(tǒng)負(fù)責(zé)從文件系統(tǒng)或者網(wǎng)絡(luò)中加載class信息,加載的類信息存放于一塊成為方法區(qū)的內(nèi)存空間。除了類的信息外,方法區(qū)中可能還會(huì)存放運(yùn)行時(shí)常量池信息,包括字符串字面量和數(shù)字常量(這部分常量信息是class文件中常量池部分的內(nèi)存映射)。 - java堆
java堆在虛擬機(jī)啟動(dòng)的時(shí)候建立,它是java程序最主要的內(nèi)存工作區(qū)域。幾乎所有的java對(duì)象實(shí)例都存放在java堆中。堆空間是所有線程共享的,這是一塊與java應(yīng)用密切相關(guān)的內(nèi)存空間。 - 直接內(nèi)存
java的NIO庫(kù)允許java程序使用直接內(nèi)存。直接內(nèi)存是在java堆外的、直接向系統(tǒng)申請(qǐng)的內(nèi)存空間。通常訪問(wèn)直接內(nèi)存的速度會(huì)優(yōu)于java堆。因此出于性能的考慮,讀寫頻繁的場(chǎng)合可能會(huì)考慮使用直接內(nèi)存。由于直接內(nèi)存在java堆外,因此它的大小不會(huì)直接受限于Xmx指定的最大堆大小,但是系統(tǒng)內(nèi)存是有限的,java堆和直接內(nèi)存的總和依然受限于操作系統(tǒng)能給出的最大內(nèi)存。 - 垃圾回收系統(tǒng)
垃圾回收系統(tǒng)是java虛擬機(jī)的重要組成部分,垃圾回收器可以對(duì)方法區(qū)、java堆和直接內(nèi)存進(jìn)行回收。其中,java堆是垃圾收集器的工作重點(diǎn)。和c/c++不同,java中所有的對(duì)象空間釋放都是隱式的,也就是說(shuō),java中沒(méi)有類似free()或者delete()這樣的函數(shù)釋放指定的內(nèi)存區(qū)域。對(duì)于不再使用的垃圾對(duì)象,垃圾回收系統(tǒng)會(huì)在后臺(tái)默默工作,默默查找、標(biāo)識(shí)并釋放垃圾對(duì)象,完成包括java堆、方法區(qū)和直接內(nèi)存中的全自動(dòng)化管理。 - java棧
每一個(gè)Java虛擬機(jī)線程都有一個(gè)私有的Java棧,一個(gè)線程的Java棧在線程創(chuàng)建的時(shí)候被創(chuàng)建,Java棧中保存著幀信息,Java棧中保存著局部變量、方法參數(shù),同時(shí)和Java方法的調(diào)用、返回密切相關(guān)。 - 本地方法棧
本地方法棧和Java棧非常類似,最大的不同在于Java棧用于方法的調(diào)用,而本地方法棧則用于本地方法的調(diào)用,作為對(duì)Java虛擬機(jī)的重要擴(kuò)展,Java虛擬機(jī)允許Java直接調(diào)用本地方法(通常使用c編寫) - PC(Program Counter)
PC寄存器也是每一個(gè)線程私有的空間,Java虛擬機(jī)會(huì)為每一個(gè)Java線程創(chuàng)建PC寄存器。在任意時(shí)刻,一個(gè)Java線程總是在執(zhí)行一個(gè)方法,這個(gè)正在被執(zhí)行的方法稱為當(dāng)前方法。如果當(dāng)前方法不是本地方法,PC寄存器就會(huì)指向當(dāng)前正在被執(zhí)行的指定。如果當(dāng)前方法是本地方法,那么PC寄存器的值就是undefined - 執(zhí)行引擎
執(zhí)行引擎是Java虛擬機(jī)的最核心組件之一,它負(fù)責(zé)執(zhí)行虛擬機(jī)的字節(jié)碼,現(xiàn)代虛擬機(jī)為了提高執(zhí)行效率,會(huì)使用即使編譯(just in time)技術(shù)將方法編譯成機(jī)器碼后再執(zhí)行。