Java虚拟机的体系结构
java虛擬機(jī)由如下五個(gè)部分組成:
? ? 一組指令集
? ?一組寄存器
? 一個(gè)棧
? 一個(gè)無(wú)用單元收集堆
? 一個(gè)方法區(qū)
1.Java指令集
? ?Java虛擬機(jī)支持大約248個(gè)字節(jié)碼,每個(gè)字節(jié)碼執(zhí)行一種基本的CPU運(yùn)算,例如把一個(gè)整數(shù)加到寄存器、子程序轉(zhuǎn)移等。Java指令集相當(dāng)于Java程序的匯編語(yǔ)言。
? ?虛擬機(jī)的內(nèi)層循環(huán)執(zhí)行過(guò)程如下:
? do{
? ? ? ? ? ? ?取一個(gè)操作符字節(jié);
? ? ? ? ? ? ?根據(jù)操作符的值執(zhí)行一個(gè)動(dòng)作;
? ? ?}while(程序未結(jié)束)
2.寄存器
?java虛擬機(jī)的寄存器用于保存機(jī)器的運(yùn)行狀體,與微處理器中的某些專(zhuān)用寄存器類(lèi)似,所有寄存器都是32位的。在java虛擬機(jī)中有如下4種寄存器。
? ? ? ?pc:java程序計(jì)數(shù)器
? ? ? ?optop:指向操作數(shù)棧頂端的指針
? ? ? ?frame: 指向當(dāng)前指向方法的執(zhí)行環(huán)境的指針
? ? ? ?vars:指向當(dāng)前指向方法的局部變量區(qū)第一個(gè)變量的指針。java虛擬機(jī)是棧式的,它不定義或使用寄存器來(lái)傳遞或接收參數(shù),目的是保證指令集的簡(jiǎn)潔性和實(shí)現(xiàn)時(shí)的高效性。
3.棧
? Java虛擬機(jī)中的棧有三個(gè)區(qū)域,分別是局部變量區(qū)、運(yùn)行環(huán)境區(qū)、操作數(shù)區(qū)。
1.局部變量區(qū)
? ? 每個(gè)Java方法使用一個(gè)固定大小的局部變臉就,長(zhǎng)整數(shù)和雙精度占據(jù)兩個(gè)局部變量的空間,安裝第一個(gè)局部變量索引來(lái)尋址(如,一個(gè)具有索引n的局部變量,如果是一個(gè)雙精度浮點(diǎn)數(shù),時(shí)間占據(jù)了n和n+1所代表的存儲(chǔ)空間)。
?2.運(yùn)行環(huán)境區(qū)
在運(yùn)行環(huán)境中包含的信息可以實(shí)現(xiàn)動(dòng)態(tài)鏈接、正常方法區(qū)返回與異常和錯(cuò)誤的傳播
? ?2.1.動(dòng)態(tài)鏈接
? ?運(yùn)行環(huán)境包括對(duì)指向當(dāng)前類(lèi)和當(dāng)前方法的解釋器符號(hào)表的指針,用于支持方法代碼的動(dòng)態(tài)鏈接。方法class文件代碼在引用要調(diào)用的方法和要訪問(wèn)的變量時(shí)使用符號(hào)。動(dòng)態(tài)鏈接把符號(hào)形式的方法調(diào)用翻譯成實(shí)際方法調(diào)用,裝載必要的類(lèi)以解釋還沒(méi)有定義的符號(hào)。
? ? 2.2.正常的方法返回
? ?執(zhí)行了具有正確類(lèi)型的返回指令時(shí),調(diào)用的方法會(huì)得到一個(gè)返回值。
? ?2. 3.異常和錯(cuò)誤傳播
? ?異常情況在Java中被稱(chēng)作Error或異常,是Throwable類(lèi)的子類(lèi),在程序中:
? ?2.3.1.動(dòng)態(tài)鏈接錯(cuò)
? ?2.3.2.運(yùn)行時(shí)錯(cuò),如對(duì)一個(gè)空指針的引用程序使用了throw語(yǔ)句
3.操作數(shù)棧區(qū)
? ? 機(jī)器指令只從操作數(shù)棧中去操作數(shù),對(duì)它們進(jìn)行操作,并把結(jié)果返回到棧中。選擇棧結(jié)構(gòu)的原因是:在只有少量寄存器或非通用寄存器的機(jī)器上,也能夠高效的模擬虛擬機(jī)的行為。
4.無(wú)用單元收集堆
? ? ? Java的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類(lèi)的實(shí)例從中分配空間。
5.方法區(qū)
它保存方法代碼和符號(hào)表。方法代碼不包括在無(wú)用單元收集堆中。
? ?每個(gè)Java虛擬機(jī)實(shí)例都有一個(gè)方法區(qū)以及一個(gè)堆,它們是由該虛擬機(jī)實(shí)例中所有線程共享的。當(dāng)虛擬機(jī)裝載一個(gè)class文件時(shí),他會(huì)從這個(gè)class文件所包含的二進(jìn)制數(shù)據(jù)中解析類(lèi)型信息。創(chuàng)建的對(duì)象放到堆中。
? ?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)編譯器和即使編譯器的代碼優(yōu)化。
? ? ? ? 任何線程都不能訪問(wèn)另外一個(gè)線程的Pc寄存器或者Java棧。
??
總結(jié)
以上是生活随笔為你收集整理的Java虚拟机的体系结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android内核和Linux内核的区别
- 下一篇: java properties 路径问题