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