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

TEL:15195455103

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

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

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

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

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

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

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

  }

  }

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

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

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

中博教育軟件學(xué)校

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

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

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

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

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

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

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

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

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

數(shù)據(jù)類(lèi)型

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

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

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

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

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

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


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

? CopyRight njjava.com ???? 蘇ICP備14052071號(hào)

搶試聽(tīng)名額

名額僅剩66名

教育改變生活

WE CHANGE LIVES