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