一、Java體系結(jié)構(gòu)
Java體系結(jié)構(gòu)包括四個(gè)獨(dú)立但相關(guān)的技術(shù):
- Java程序設(shè)計(jì)語(yǔ)言
- Java class文件格式
- Java應(yīng)用編程接口(API)
- Java虛擬機(jī)
二、Java虛擬機(jī)
Java虛擬機(jī)是Java的面向網(wǎng)絡(luò)的核心,它支持Java面向網(wǎng)絡(luò)體系結(jié)構(gòu)三大支柱的所有方面:平臺(tái)無(wú)關(guān)性,安全性和網(wǎng)絡(luò)移動(dòng)性。Java虛擬機(jī)的主要任務(wù)是裝載class文件并且執(zhí)行其中的字節(jié)碼。classloader負(fù)責(zé)裝載class文件,執(zhí)行引擎負(fù)責(zé)執(zhí)行字節(jié)碼。
執(zhí)行引擎
由于Java虛擬機(jī)規(guī)范只定義了每個(gè)虛擬機(jī)都必須實(shí)現(xiàn)的特性,沒(méi)有規(guī)定具體的實(shí)現(xiàn)方法,因此不同的Java虛擬機(jī),執(zhí)行引擎可能實(shí)現(xiàn)的非常不同,一般來(lái)說(shuō)有如下幾種實(shí)現(xiàn)方法:
- 一次性解釋字節(jié)碼。
- 即時(shí)編譯器(just-in-time compiler),這種情況下,第一次被執(zhí)行的字節(jié)碼會(huì)被編譯成本地機(jī)器代碼,編譯出的本地機(jī)器代碼會(huì)被緩存,當(dāng)方法以后被調(diào)用的時(shí)候可以重用。
- 自適應(yīng)優(yōu)化器,這種情況下,虛擬機(jī)開(kāi)始的時(shí)候解釋字節(jié)碼,但是會(huì)監(jiān)視運(yùn)行中程序的活動(dòng),并且記錄下使用頻繁的代碼段,程序運(yùn)行的時(shí)候,虛擬機(jī)只會(huì)把那些活動(dòng)最頻繁的代碼編譯成本地版本,其他仍舊保留字節(jié)碼--由虛擬機(jī)繼續(xù)解釋它們。一個(gè)自適應(yīng)的優(yōu)化器可以使得Java虛擬機(jī)在80%-90%的時(shí)間里執(zhí)行被優(yōu)化過(guò)的本地代碼。
- 由硬件芯片構(gòu)成,由本地方法執(zhí)行Java字節(jié)碼,實(shí)際上這種實(shí)現(xiàn)是把執(zhí)行引擎內(nèi)嵌在芯片里。
Classloader
一個(gè)java應(yīng)用程序可以有兩種類裝載器:?jiǎn)?dòng)類裝載器(bootstrap)和用戶定義的類裝載器,啟動(dòng)類裝載器是唯一的,它屬于Java虛擬機(jī)實(shí)現(xiàn)的一部分。
每一個(gè)類裝載器都有它自己的命名空間,一個(gè)類只能”看到“由同一個(gè)類裝載器裝載的其他類,不能跨命名空間訪問(wèn)。
用過(guò)允許實(shí)例化用戶自定義的類裝載器(該類裝載器知道如何從網(wǎng)絡(luò)下載class文件),Java類裝載器的體系結(jié)構(gòu)提供了對(duì)網(wǎng)絡(luò)移動(dòng)性的支持;通過(guò)允許使用不同的用戶定義的類裝載器裝載不同來(lái)源的class文件,Java類裝載器的體系結(jié)構(gòu)提供了對(duì)完全性的支持。