溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java虛擬機(jī)內(nèi)部由什么構(gòu)成

發(fā)布時(shí)間:2021-07-14 09:05:31 來源:億速云 閱讀:95 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“Java虛擬機(jī)內(nèi)部由什么構(gòu)成”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java虛擬機(jī)內(nèi)部由什么構(gòu)成”吧!

Java虛擬機(jī)是一個(gè)想象中的機(jī)器,正如其名是虛擬的。在實(shí)際計(jì)算機(jī)上市通過軟件模擬實(shí)現(xiàn)的。它有虛擬的硬件,如處理器、堆棧、寄存器等,還有相應(yīng)的指令系統(tǒng)。它屏蔽了與具體平臺(tái)相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼即字節(jié)碼,這樣就可以在多個(gè)平臺(tái)上不加修改的運(yùn)行。Java虛擬機(jī)在執(zhí)行字節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行。這正是Java語言具有與平臺(tái)無關(guān)性的原因。

Java虛擬機(jī)由五部分組成:指令集、寄存器、棧、無用單元回收堆(garbage-collected-heap)、方法區(qū)域。它們構(gòu)成了Java虛擬機(jī)的邏輯成份,不依賴任何實(shí)現(xiàn)技術(shù)或組織方式,但他們的功能必須在真實(shí)機(jī)器上以某種方式實(shí)現(xiàn)。Java虛擬機(jī)支持大約248個(gè)字節(jié)碼。每個(gè)字節(jié)碼執(zhí)行一種基本的CPU運(yùn)算,例如,把一個(gè)整數(shù)加到寄存器,子程序轉(zhuǎn)移等。Java指令集相當(dāng)于Java程序的匯編語言。其中的指令包含一個(gè)單字節(jié)的操作符,用于指定要執(zhí)行的操作,還有0個(gè)或多個(gè)操作數(shù),提供操作所需的參數(shù)或數(shù)據(jù)。許多指令沒有操作數(shù),僅有一個(gè)單字節(jié)的操作符構(gòu)成。虛擬機(jī)的內(nèi)層循環(huán)的執(zhí)行過程如下:

do{取一個(gè)操作符字節(jié):根據(jù)操作符的值執(zhí)行一個(gè)動(dòng)作;}while(程序未結(jié)束)

由于指令系統(tǒng)的簡單性,使得虛擬機(jī)的執(zhí)行過程十分簡單,從而有利于提高執(zhí)行效率。指令中操作數(shù)的數(shù)量和大小是由操作符決定的。如果操作數(shù)比一個(gè)字節(jié)大那么它存儲(chǔ)的順序是高字節(jié)優(yōu)先。例如,一個(gè)16位的參數(shù)存放時(shí)占用兩個(gè)字節(jié),其值為***個(gè)字節(jié)×256+第二個(gè)字節(jié)。字節(jié)碼指令流一般只是字節(jié)對(duì)齊的。指令tableswitch和lookup是例外,這兩條指令內(nèi)部要求強(qiáng)制的4字節(jié)邊界對(duì)齊。
 
Java虛擬機(jī)的寄存器用于保存機(jī)器的運(yùn)行狀態(tài),與微處理器中的某些專用寄存器類似。Java虛擬機(jī)的寄存器有4種:pc:Java程序計(jì)數(shù)器,optop:指向操作數(shù)棧頂端的指針,frame:指向當(dāng)前執(zhí)行環(huán)境的指針,vars:指向當(dāng)前執(zhí)行方法的局部變量區(qū)***個(gè)變量的指針。Java虛擬機(jī)是棧式的,他不定義或使用寄存器來傳遞或接受參數(shù),其目的是為了保證指令集的簡潔性和實(shí)現(xiàn)時(shí)的高效性特別是對(duì)于寄存器數(shù)目不多的處理器。所有寄存器 都是32位的。

Java虛擬機(jī)的棧有三個(gè)區(qū)域:局部變量區(qū)、運(yùn)行環(huán)境區(qū)、操作數(shù)區(qū)。局部變量區(qū)每個(gè)Java方法使用一個(gè)固定大小的局部變量集。它們按照與ars寄存器的字偏移量來尋址。局部變量都是32位的。長整數(shù)和雙精度浮點(diǎn)數(shù)占據(jù)了2個(gè)局部變量的空間,卻按照***個(gè)局部變量的索引來尋址。虛擬機(jī)規(guī)范并不要求在局部變量中的64 為的值是64位對(duì)其的虛擬機(jī)提供了把局部變量中的值裝載到操作數(shù)棧的指令,也提供了把操作數(shù)棧中的值寫入局部變量的指令。

在運(yùn)行環(huán)境中包含的信息用于動(dòng)態(tài)鏈接,正常的方法返回以及異常傳播。運(yùn)行環(huán)境包括對(duì)指向當(dāng)前類和當(dāng)前方法的解釋器符號(hào)表的指針,用于支持方法代碼的動(dòng)態(tài)鏈接。方法的class文件代碼在引用要調(diào)用的方法和要訪問的變量時(shí)使用符號(hào)。動(dòng)態(tài)鏈接把符號(hào)形式的方法調(diào)用翻譯成實(shí)際方法調(diào)用,裝載必要的類以解釋還沒有定義的符號(hào),并把變量訪問翻譯成與這些變量運(yùn)行時(shí)的存貯結(jié)構(gòu)相應(yīng)的偏移地址。動(dòng)態(tài)鏈接方法和變量使的方法中使用的其它類的變化不會(huì)影響到本程序的代碼。如果當(dāng)前方法正常地結(jié)束了,在執(zhí)行了一條具有正確類型的返回指令時(shí),調(diào)用的方法會(huì)得到一個(gè)返回值。執(zhí)行環(huán)境在正常返回的情況下用于恢復(fù)調(diào)用者的寄存器,并把調(diào)用者的寄存器計(jì)算器增加一個(gè)恰當(dāng)?shù)闹?,一跳過已執(zhí)行過的方法。調(diào)用指令然后再調(diào)用者的執(zhí)行環(huán)境中繼續(xù)執(zhí)行下去。異常情況下在Java中被稱作error(錯(cuò)誤)或exception(異常),是throwable類的子類。在程序中出錯(cuò)的原因是動(dòng)態(tài)鏈接出錯(cuò)如無法找到所需class文件,運(yùn)行時(shí)出錯(cuò)如一個(gè)空指針的引用。程序使用了throw語句。

當(dāng)異常發(fā)生時(shí),Java虛擬機(jī)采取如下措施:檢查與當(dāng)前方法相關(guān)的catch子句表,每個(gè)catch子句包含其有效指令范圍,能夠處理異常類型以及處理異常代碼塊地址。與異常相匹配的catch子句應(yīng)該符合一下條件:造成異常的指令在指令范圍內(nèi),發(fā)生異常類型是其能夠處理的異常類型的子類型。如果找到了匹配的catch子句,那么系統(tǒng)轉(zhuǎn)到異常處理模塊執(zhí)行;否則重復(fù)尋找直到找到為止。如果找不到則得到一個(gè)“未截獲異常”的結(jié)果并返回到當(dāng)前方法的調(diào)用者好像異常剛剛在其調(diào)用者中發(fā)生一樣。如果調(diào)用者仍然沒有找到相應(yīng)的異常處理,那么系統(tǒng)將調(diào)用一個(gè)缺省的異常處理模塊。
 
機(jī)器指令只從操作數(shù)棧中取操作數(shù),對(duì)他們進(jìn)行操作,并把結(jié)果返回到棧中。棧用于給方法傳遞參數(shù)并從方法接受結(jié)果,也用于支持操作數(shù)的參數(shù)并保存操作結(jié)果。Java的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類的實(shí)例從中分配空間。Java語言有無用單元回收功能:不給程序員顯式釋放對(duì)象的能力。不規(guī)定具體使用的無用單元收集算法??梢愿鶕?jù)系統(tǒng)需求使用各種各樣的算法。

方法區(qū)與傳統(tǒng)語言中的編譯后代碼或是unix進(jìn)程中的正文段相似。保存方法代碼(編譯后的Java代碼)和符號(hào)表。在當(dāng)前的Java實(shí)現(xiàn)中,方法代碼不包括在無用回收集堆中但計(jì)劃在將來的版本實(shí)現(xiàn)。

到此,相信大家對(duì)“Java虛擬機(jī)內(nèi)部由什么構(gòu)成”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI