1. 程式人生 > 其它 >Java虛擬機器(JVM)的規格描述

Java虛擬機器(JVM)的規格描述

JVM的設計目標是提供一個基於抽象規格描述的計算機模型,為解釋程式開發人員提範的任何系統上執行。JVM對其實現的某些方面給出了具體的定義,特別是對Java可執行程式碼,即位元組碼(Bytecode)的格式給出了明確的規格。這一規格包括操作碼和運算元的語法和數值、識別符號的數值表示方式、以及Java類檔案中的Java物件、常量緩衝池在JVM的儲存映象。這些定義為JVM直譯器開發人員提供了所需的資訊和開發環境。Java的設計者希望給開發人員以隨心所欲使用Java的自由。

JVM定義了控制Java程式碼解釋執行和具體實現的五種規格,它們是:

*JVM指令系統

*JVM暫存器

*JVM棧結構

*JVM碎片回收堆

*JVM儲存區

指令系統

JVM指令系統同其他計算機的指令系統極其相似。Java指令也是由操作碼和運算元兩部分組成。操作碼為8位二進位制數,運算元進緊隨在操作碼的後面,其長度根據需要而不同。操作碼用於指定一條指令操作的性質(在這裡我們採用彙編符號的形式進行說明),如iload表示從儲存器中裝入一個整數,anewarray表示為一個新陣列分配空間,iand表示兩個整數的"與",ret用於流程控制,表示從對某一方法的呼叫中返回。當長度大於8位時,運算元被分為兩個以上位元組存放。JVM採用了"big endian"的編碼方式來處理這種情況,即高位bits存放在低位元組中。這同 Motorola及其他的RISC CPU採用的編碼方式是一致的,而與Intel採用的"little endian "的編碼方式即低位bits存放在低位位元組的方法不同。Java指令系統是以Java語言的實現為目的設計的,其中包含了用於呼叫方法和監視多執行緒系統的指令。Java的8位操作碼的長度使得JVM最多有256種指令,java1.6及以上版本已使用了160多種操作碼。

暫存器

所有的CPU均包含用於儲存系統狀態和處理器所需資訊的暫存器組。如果虛擬機器定義較多的暫存器,便可以從中得到更多的資訊而不必對棧或記憶體進行訪問,這有利於提高執行速度。然而,如果虛擬機器中的暫存器比實際CPU的暫存器多,在實現虛擬機器時就會佔用處理器大量的時間來用常規儲存器模擬暫存器,這反而會降低虛擬機器的效率。針對這種情況,JVM只設置了4個最為常用的暫存器。它們是:pc程式計數器optop運算元棧頂指標frame當前執行環境指標 vars指向當前執行環境中第一個區域性變數的指標 所有暫存器均為32位。pc用於記錄程式的執行。optop,frame和vars用於記錄指向Java棧區的指標。

棧結構

作為基於棧結構的計算機,Java棧是JVM儲存資訊的主要方法。當JVM得到一個Java位元組碼應用程式後,便為該程式碼中一個類的每一個方法建立一個棧框架,以儲存該方法的狀態資訊。每個棧框架包括以下三類資訊:區域性變數,執行環境,運算元棧。

區域性變數用於儲存一個類的方法中所用到的區域性變數。vars暫存器指向該變量表中的第一個區域性變數。

執行環境用於儲存直譯器對Java位元組碼進行解釋過程中所需的資訊。它們是:上次呼叫的方法、區域性變數指標和運算元棧的棧頂和棧底指標。執行環境是一個執行一個方法的控制中心。例如:如果直譯器要執行iadd(整數加法),首先要從frame暫存器中找到當前執行環境,而後便從執行環境中找到運算元棧,從棧頂彈出兩個整數進行加法運算,最後將結果壓入棧頂。

運算元棧用於儲存運算所需運算元及運算的結果。

碎片回收堆

Java類的例項所需的儲存空間是在堆上分配的。直譯器具體承擔為類例項分配空間的工作。直譯器在為一個例項分配完儲存空間後,便開始記錄對該例項所佔用的記憶體區域的使用。一旦物件使用完畢,便將其回收到堆中。在Java語言中,除了new語句外沒有其他方法為一物件申請和釋放記憶體。對記憶體進行釋放和回收的工作是由Java執行系統承擔的。這允許Java執行系統的設計者自己決定碎片回收的方法。在SUN公司開發的Java直譯器和Hot Java環境中,碎片回收用後臺執行緒的方式來執行。這不但為執行系統提供了良好的效能,而且使程式設計人員擺脫了自己控制記憶體使用的風險。

儲存區

JVM有兩類儲存區:常量緩衝池和方法區。常量緩衝池用於儲存類名稱、方法和欄位名稱以及串常量。方法區則用於儲存Java方法的位元組碼。對於這兩種儲存區域具體實現方式在JVM規格中沒有明確規定。這使得Java應用程式的儲存佈局必須在執行過程中確定,依賴於具體平臺的實現方式。JVM是為Java位元組碼定義的一種獨立於具體平臺的規格描述,是Java平臺獨立性的基礎。儘管JVM還存在一些限制和不足,有待於進一步的完善,但無論如何,JVM的思想是成功的。對比分析:如果把Java原程式想象成我們的C++原程式,Java原程式編譯後生成的位元組碼就相當於C++原程式編譯後的80x86的機器碼(二進位制程式檔案),JVM虛擬機器相當於80x86計算機系統,Java直譯器相當於80x86CPU。在80x86CPU上執行的是機器碼,在Java直譯器上執行的是Java位元組碼。

Java直譯器相當於執行Java位元組碼的“CPU”,但該“CPU”不是通過硬體實現的,而是用軟體實現的。Java直譯器實際上就是特定的平臺下的一個應用程式。只要實現了特定平臺下的直譯器程式,Java位元組碼就能通過直譯器程式在該平臺下執行,這是Java跨平臺的根本。當前,並不是在所有的平臺下都有相應Java直譯器程式,這也是Java並不能在所有的平臺下都能執行的原因,它只能在已實現了Java直譯器程式的平臺下執行。

Java入門推薦:2022年最新整理Java合集_Java適合初學者的教程_Java名師手把手圖解教程

以上是小編整理的一套完整的Java學習教程,希望對大家的學習有所幫助!