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