柚子快報激活碼778899分享:【基礎(chǔ)篇】一、認(rèn)識JVM
文章目錄
1、虛擬機(jī)2、Java虛擬機(jī)3、JVM的整體結(jié)構(gòu)4、Java代碼的執(zhí)行流程5、JVM的三大功能6、JVM的分類7、JVM的生命周期
1、虛擬機(jī)
虛擬機(jī),Virtual Machine,一臺虛擬的計算機(jī),用來執(zhí)行虛擬計算機(jī)指令。分為:
系統(tǒng)虛擬機(jī):如VMware,是完全對物理計算機(jī)的仿真程序虛擬機(jī):如JVM,專門為執(zhí)行單個計算機(jī)程序而設(shè)計,JVM中執(zhí)行的指令就是Java字節(jié)碼指令
不論是哪種類型虛擬機(jī),其上面運行的軟件或者程序,都被限制于虛擬機(jī)所提供的資源之內(nèi)。
2、Java虛擬機(jī)
JVM,Java Virtual Machine ,即Java虛擬機(jī),一臺處理Java字節(jié)碼文件(解釋為二進(jìn)制文件)的虛擬計算機(jī),本質(zhì)是一個運行在計算機(jī)上的程序。 JVM運行在操作系統(tǒng)之上,并沒有與計算機(jī)的硬件做直接的交互。(因此,不同的操作系統(tǒng),對應(yīng)著不同的JVM)
JVM ? JRE ? JDK三者的關(guān)系:
3、JVM的整體結(jié)構(gòu)
以HotSpot為例:
以上架構(gòu)分三層看:(首先javac編譯器將xx.java源文件編譯為xx.class字節(jié)碼文件)
最上層由類裝載器將字節(jié)碼文件加載到內(nèi)存中,生成一個大的class對象中間層,其中方法區(qū)、堆區(qū)是所有線程共享,而棧、程序計數(shù)器、寄存器是一個線程一個最下層,執(zhí)行引擎里包括解釋器、JIT即時編譯器、GC垃圾回收器
上面結(jié)構(gòu)圖再詳細(xì):
4、Java代碼的執(zhí)行流程
Java做為一種跨平臺的語言,一次編譯,到處運行。即Java源代碼被成功編譯為.class字節(jié)碼后,換平臺運行,無需再次編譯。
具體流程為:
Java源文件x.java被編譯器javac.exe(JDK自帶)編譯成字節(jié)碼文件x.class類裝載器加載字節(jié)碼文件到JVMJVM執(zhí)行引擎中的解釋器將字節(jié)碼文件處理成二進(jìn)制文件操作系統(tǒng)執(zhí)行二進(jìn)制文件和硬件進(jìn)行交互
PS:Java虛擬機(jī)不關(guān)心運行在其內(nèi)部的程序是用的什么語言,只要是遵循其規(guī)范編譯的字節(jié)碼文件,就都能運行。
換言之,不是牛在Java,而是JVM。Java是跨平臺的語言 ? JVM是跨語言的平臺
5、JVM的三大功能
1)解釋和運行
把字節(jié)碼解釋成二進(jìn)制機(jī)器碼
2)內(nèi)存管理
自動為對象、方法等分配內(nèi)存空間,以及回收不再使用的對象
3)即時編譯JIT(Just-In-Time)
對熱點代碼(熱點代碼即很短的時間內(nèi)被多次調(diào)用) 進(jìn)行優(yōu)化,提升執(zhí)行效率。Java如果不做任何優(yōu)化,性能不如C、C++,因為后者編譯后得到的就是機(jī)器碼,少了解釋這一步
Java多字節(jié)碼解釋為機(jī)器碼這一步,是為例支持跨平臺,有失有得:
即時編譯是將熱點代碼解釋完后保存在內(nèi)存中,下次執(zhí)行直接調(diào)用,省了一步解釋操作的時間:
6、JVM的分類
Sun Classic VM , 1996 + Java1.0 + 只有解釋器,沒有JIT即時編譯器(因此性能較差)Exact VM,Java1.2,準(zhǔn)確式內(nèi)存管理,可直到內(nèi)存中某個位置的數(shù)據(jù)具體是什么類型HotSpot VM,JDK1.3時,成為默認(rèn)的虛擬機(jī)JRockit VM,專注于服務(wù)器端,不包含解釋器IBM的J9,與上面的HotSpot、JRockit是三大商用虛擬機(jī),2017年開源,命名為Open J9KVM和CDC/CLDC HotspotMicrosoft JVMTaobao JVM,阿里…
Open JDK版本的HotSpot可以做二次開發(fā),不管是二開還是開發(fā)新的虛擬機(jī),都要遵守Oracle制定的JVM開發(fā)規(guī)范。最后,默認(rèn)的HotSpot的發(fā)展歷程:
7、JVM的生命周期
STEP1:啟動
JVM的啟動時通過引導(dǎo)類加載器bootstrap class loader創(chuàng)建一個初始類initial class來完成的,不同的虛擬機(jī),這個類也不同
STEP2:執(zhí)行
開始執(zhí)行Java程序時,JVM開始運行,程序執(zhí)行結(jié)束,JVM也就停止了(jsp看JVM進(jìn)程,會發(fā)現(xiàn)其隨著程序的結(jié)束而結(jié)束)
STEP3:退出
程序正常執(zhí)行結(jié)束,JVM退出程序執(zhí)行中遇到異?;蝈e誤,且一值向上throw到了main方法,main再拋,就到JVM,JVM退出操作系統(tǒng)出現(xiàn)錯誤也會可知JVM進(jìn)程終止,JVM退出某個線程調(diào)用Runtime類或System類的exit方法,或者說是Runtime類的halt方法(底層是native halt0方法)
柚子快報激活碼778899分享:【基礎(chǔ)篇】一、認(rèn)識JVM
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。