四虎影视库国产精品一区-四虎影视库-四虎影视久久久免费-四虎影视久久久-四虎影视久久-四虎影视精品永久免费网站

TEL:15195455103

Java培訓(xùn) > Java知識 >

JAVA虛擬機(jī)體系結(jié)構(gòu)

作者:南京????來源:南京????發(fā)布時間:2020-01-08 09:59????瀏覽量:199

JAVA虛擬機(jī)的生命周期

  一個運(yùn)行時的Java虛擬機(jī)實(shí)例的天職是:負(fù)責(zé)運(yùn)行一個java程序。當(dāng)啟動一個Java程序時,一個虛擬機(jī)實(shí)例也就誕生了。當(dāng)該程序關(guān)閉退出,這個虛擬機(jī)實(shí)例也就隨之消亡。如果同一臺計算機(jī)上同時運(yùn)行三個Java程序,將得到三個Java虛擬機(jī)實(shí)例。每個Java程序都運(yùn)行于它自己的Java虛擬機(jī)實(shí)例中。

  Java虛擬機(jī)實(shí)例通過調(diào)用某個初始類的main()方法來運(yùn)行一個Java程序。而這個main()方法必須是共有的(public)、靜態(tài)的(static)、返回值為void,并且接受一個字符串?dāng)?shù)組作為參數(shù)。任何擁有這樣一個main()方法的類都可以作為Java程序運(yùn)行的起點(diǎn)。

  publicclassTest {publicstaticvoidmain(String[] args) {//TODO Auto-generated method stubSystem.out.println("Hello World");

  }

  }

  在上面的例子中,Java程序初始類中的main()方法,將作為該程序初始線程的起點(diǎn),任何其他的線程都是由這個初始線程啟動的。

  在Java虛擬機(jī)內(nèi)部有兩種線程:守護(hù)線程和非守護(hù)線程。守護(hù)線程通常是由虛擬機(jī)自己使用的,比如執(zhí)行垃圾收集任務(wù)的線程。但是,Java程序也可以把它創(chuàng)建的任何線程標(biāo)記為守護(hù)線程。而Java程序中的初始線程——就是開始于main()的那個,是非守護(hù)線程。

  只要還有任何非守護(hù)線程在運(yùn)行,那么這個Java程序也在繼續(xù)運(yùn)行。當(dāng)該程序中所有的非守護(hù)線程都終止時,虛擬機(jī)實(shí)例將自動退出。假若安全管理器允許,程序本身也能夠通過調(diào)用Runtime類或者System類的exit()方法來退出。

北大青鳥軟件學(xué)校

JAVA虛擬機(jī)的體系結(jié)構(gòu)

  下圖是JAVA虛擬機(jī)的結(jié)構(gòu)圖,每個Java虛擬機(jī)都有一個類裝載子系統(tǒng),它根據(jù)給定的全限定名來裝入類型(類或接口)。同樣,每個Java虛擬機(jī)都有一個執(zhí)行引擎,它負(fù)責(zé)執(zhí)行那些包含在被裝載類的方法中的指令。

  當(dāng)JAVA虛擬機(jī)運(yùn)行一個程序時,它需要內(nèi)存來存儲許多東西,例如:字節(jié)碼、從已裝載的class文件中得到的其他信息、程序創(chuàng)建的對象、傳遞給方法的參數(shù),返回值、局部變量等等。Java虛擬機(jī)把這些東西都組織到幾個“運(yùn)行時數(shù)據(jù)區(qū)”中,以便于管理。

  某些運(yùn)行時數(shù)據(jù)區(qū)是由程序中所有線程共享的,還有一些則只能由一個線程擁有。每個Java虛擬機(jī)實(shí)例都有一個方法區(qū)以及一個堆,它們是由該虛擬機(jī)實(shí)例中所有的線程共享的。當(dāng)虛擬機(jī)裝載一個class文件時,它會從這個class文件包含的二進(jìn)制數(shù)據(jù)中解析類型信息。然后把這些類型信息放到方法區(qū)中。當(dāng)程序運(yùn)行時,虛擬機(jī)會把所有該程序在運(yùn)行時創(chuàng)建的對象都放到堆中。

  當(dāng)每一個新線程被創(chuàng)建時,它都將得到它自己的PC寄存器(程序計數(shù)器)以及一個Java棧,如果線程正在執(zhí)行的是一個Java方法(非本地方法),那么PC寄存器的值將總是指向下一條將被執(zhí)行的指令,而它的Java棧則總是存儲該線程中Java方法調(diào)用的狀態(tài)——包括它的局部變量,被調(diào)用時傳進(jìn)來的參數(shù)、返回值,以及運(yùn)算的中間結(jié)果等等。而本地方法調(diào)用的狀態(tài),則是以某種依賴于具體實(shí)現(xiàn)的方法存儲在本地方法棧中,也可能是在寄存器或者其他某些與特定實(shí)現(xiàn)相關(guān)的內(nèi)存區(qū)中。

  Java棧是由許多棧幀(stack frame)組成的,一個棧幀包含一個Java方法調(diào)用的狀態(tài)。當(dāng)線程調(diào)用一個Java方法時,虛擬機(jī)壓入一個新的棧幀到該線程的Java棧中,當(dāng)該方法返回時,這個棧幀被從Java棧中彈出并拋棄。

  Java虛擬機(jī)沒有寄存器,其指令集使用Java棧來存儲中間數(shù)據(jù)。這樣設(shè)計的原因是為了保持Java虛擬機(jī)的指令集盡量緊湊、同時也便于Java虛擬機(jī)在那些只有很少通用寄存器的平臺上實(shí)現(xiàn)。另外,Java虛擬機(jī)這種基于棧的體系結(jié)構(gòu),也有助于運(yùn)行時某些虛擬機(jī)實(shí)現(xiàn)的動態(tài)編譯器和即時編譯器的代碼優(yōu)化。

  下圖描繪了Java虛擬機(jī)為每一個線程創(chuàng)建的內(nèi)存區(qū),這些內(nèi)存區(qū)域是私有的,任何線程都不能訪問另一個線程的PC寄存器或者Java棧。

  Java棧都是向下生長的,而棧頂都顯示在圖的底部。當(dāng)前正在執(zhí)行的方法的棧幀則以淺色表示,對于一個正在運(yùn)行Java方法的線程而言,它的PC寄存器總是指向下一條將被執(zhí)行的指令。比如線程1和線程2都是以淺色顯示的,由于線程3當(dāng)前正在執(zhí)行一個本地方法,因此,它的PC寄存器——以深色顯示的那個,其值是不確定的。

數(shù)據(jù)類型

  Java虛擬機(jī)是通過某些數(shù)據(jù)類型來執(zhí)行計算的,數(shù)據(jù)類型可以分為兩種:基本類型和引用類型,基本類型的變量持有原始值,而引用類型的變量持有引用值。

  Java語言中的所有基本類型同樣也都是Java虛擬機(jī)中的基本類型。但是boolean有點(diǎn)特別,雖然Java虛擬機(jī)也把boolean看做基本類型,但是指令集對boolean只有很有限的支持,當(dāng)編譯器把Java源代碼編譯為字節(jié)碼時,它會用int或者byte來表示boolean。在Java虛擬機(jī)中,false是由整數(shù)零來表示的,所有非零整數(shù)都表示true,涉及boolean值的操作則會使用int。另外,boolean數(shù)組是當(dāng)做byte數(shù)組來訪問的,但是在“堆”區(qū),它也可以被表示為位域。

  Java虛擬機(jī)還有一個只在內(nèi)部使用的基本類型:returnAddress,Java程序員不能使用這個類型,這個基本類型被用來實(shí)現(xiàn)Java程序中的finally子句。該類型是jsr, ret以及jsr_w指令需要使用到的,它的值是JVM指令的操作碼的指針。returnAddress類型不是簡單意義上的數(shù)值,不屬于任何一種基本類型,并且它的值是不能被運(yùn)行中的程序所修改的。

  Java虛擬機(jī)的引用類型被統(tǒng)稱為“引用(reference)”,有三種引用類型:類類型、接口類型、以及數(shù)組類型,它們的值都是對動態(tài)創(chuàng)建對象的引用。類類型的值是對類實(shí)例的引用;數(shù)組類型的值是對數(shù)組對象的引用,在Java虛擬機(jī)中,數(shù)組是個真正的對象;而接口類型的值,則是對實(shí)現(xiàn)了該接口的某個類實(shí)例的引用。還有一種特殊的引用值是null,它表示該引用變量沒有引用任何對象。(相關(guān)推薦:java程序員筆試所需

JAVA中方法參數(shù)的引用傳遞

  java中參數(shù)的傳遞有兩種,分別是按值傳遞和按引用傳遞。按值傳遞不必多說,下面就說一下按引用傳遞。


本文內(nèi)容、圖片由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至2353260942@qq.com 舉報,一經(jīng)查實(shí),本站將立刻刪除。(如需投稿聯(lián)系管理員開通!)

? CopyRight njjava.com ???? 蘇ICP備14052071號

搶試聽名額

名額僅剩66名

教育改變生活

WE CHANGE LIVES