【Java虛擬機器結構(第2部分)運行時資料區】摘要,java虛擬機器
《Java虛擬機器規範(Java SE 7版)》作者:Tim Lindholm、Frank Yellin、Gilad Bracha、Alex Buckley 摘要:第二章 Java虛擬機器結構(第2部分)
本規範描述的是一種抽象化的虛擬機器的行為,而不是任何一種被廣泛使用的虛擬機器實現。
2.5 運行時資料區
Java虛擬機器定義了若干種程式運行期間會使用到的運行時資料區,其中有一些會隨著虛擬機器啟動而建立,隨著虛擬機器退出而銷毀。另外一些則是與線程一一對應的,這些與線程對應的資料區域會隨著線程開始和結束而建立和銷毀。
2.5.1 PC寄存器
每一條Java虛擬機器線程都有自己的PC(Program Counter)寄存器。
PC寄存器的容量至少應當能儲存一個returnAddress類型的資料或者一個與平台相關的本地指標的值。
- 如果有個非native方法正被線程執行,寄存器就儲存Java虛擬機器正在執行的位元組碼指令的地址。
- 如果該方法是native的,那PC寄存器的值是undefined
2.5.2 Java虛擬機器棧
每一條Java虛擬機器線程都有自己私人的Java虛擬機器棧(Java Virtual Machine Stack),這個棧與線程同時建立,用於儲存棧幀。
Java虛擬機器棧的作用:用於儲存局部變數與一些過程結果的地方。另外,它在方法調用和返回中也扮演了很重要的角色。
因為除了棧幀的出棧和入棧之外,Java虛擬機器棧不會再受其他因素的影響,所以棧幀可以在堆中分配
Java虛擬機器棧所使用的記憶體不需要保證是連續的。
2.5.3 Java堆
在Java虛擬機器中,堆(Heap)是可供各條線程共用的運行時記憶體地區,也是供所有類執行個體和數組對象分配記憶體的地區。
Java堆在虛擬機器啟動的時候就被建立,它儲存了被自動記憶體管理系統(垃圾收集器)所管理的各種對象,這些受管理的對象無需,也無法顯式地被銷毀。
2.5.4 方法區
方法區(Method Area)是可供各條線程共用的運行時記憶體地區
方法區,儲存了每一個類的結構資訊,例如運行時常量池(Runtime Constant Pool)、欄位和方法資料、建構函式和普通方法的位元組碼內容、還包括一些在類、執行個體、介面初始化時用到的特殊方法
方法區在虛擬機器啟動的時候被建立,雖然方法區是堆的邏輯組成部分,但是簡單的虛擬機器實現可以選擇在這個地區不實現垃圾收集。
2.5.5 運行時常量池
運行時常量池:每一個類或介面的常量池的運行時表示形式,包括從編譯期可知的數值字面量到必須運行期解析後才能獲得的方法或欄位引用。
每一個運行時常量池都分配在Java虛擬機器的方法區之中,在類和介面被載入到虛擬機器後,對應的運行時常量池就被建立出來。
2.5.6 本地方法棧
Java虛擬機器實現可能會使用到傳統的棧來支援native方法的執行,這個棧就是本地方法棧(Native Method Stack)。
如果支援本地方法棧,那這個棧一般會線上程建立的時候按線程分配。
Java虛擬機器詳解?
1 Java技術與Java虛擬機器
說起Java,人們首先想到的是Java程式設計語言,然而事實上,Java是一種技術,它由四方面組成: Java程式設計語言、Java類檔案格式、Java虛擬機器和Java應用程式介面(Java API)。它們的關係如所示:
圖1 Java四個方面的關係
運行期環境代表著Java平台,開發人員編寫Java代碼(.java檔案),然後將之編譯成位元組碼(.class檔案)。最後位元組碼被裝入記憶體,一旦位元組碼進入虛擬機器,它就會被解譯器解釋執行,或者是被即時代碼發生器有選擇的轉換成機器碼執行。從也可以看出Java平台由Java虛擬機器和 Java應用程式介面搭建,Java語言則是進入這個平台的通道,用Java語言編寫並編譯的程式可以運行在這個平台上。這個平台的結構如所示:
在Java平台的結構中, 可以看出,Java虛擬機器(JVM) 處在核心的位置,是程式與底層作業系統和硬體無關的關鍵。它的下方是移植介面,移植介面由兩部分組成:適配器和Java作業系統, 其中依賴於平台的部分稱為適配器;JVM 通過移植介面在具體的平台和作業系統上實現;在JVM 的上方是Java的基本類庫和擴充類庫以及它們的API, 利用Java API編寫的應用程式(application) 和小程式(Java applet) 可以在任何Java平台上運行而無需考慮底層平台, 就是因為有Java虛擬機器(JVM)實現了程式與作業系統的分離,從而實現了Java 的平台無關性。
那麼到底什麼是Java虛擬機器(JVM)呢?通常我們談論JVM時,我們的意思可能是:
對JVM規範的的比較抽象的說明;
對JVM的具體實現;
在程式運行期間所產生的一個JVM執行個體。
對JVM規範的的抽象說明是一些概念的集合,它們已經在書《The Java Virtual Machine Specification》(《Java虛擬機器規範》)中被詳細地描述了;對JVM的具體實現要麼是軟體,要麼是軟體和硬體的組合,它已經被許多生產廠商所實現,並存在於多種平台之上;運行Java程式的任務由JVM的運行期執行個體單個承擔。在本文中我們所討論的Java虛擬機器(JVM)主要針對第三種情況而言。它可以被看成一個想象中的機器,在實際的電腦上通過軟體類比來實現,有自己想象中的硬體,如處理器、堆棧、寄存器等,還有自己相應的指令系統。
JVM在它的生存周期中有一個明確的任務,那就是運行Java程式,因此當Java程式啟動的時候,就產生JVM的一個執行個體;當程式運行結束的時候,該執行個體也跟著消失了。下面我們從JVM的體繫結構和它的運行過程這兩個方面來對它進行比較深入的研究。
2 Java虛擬機器的體繫結構
剛才已經提到,JVM可以由不同的廠商來實現。由於廠商的不同必然導致JVM在實現上的一些不同,然而JVM還是可以實現跨平台的特性,這就要歸功於設計JVM時的體繫結構了。
我們知道,一個JVM執行個體的行為不光是它自己的事,還涉及到它的子系統、儲存地區、資料類型和指令這些部分,它們描述了JVM的一個抽象的內部體繫結構,其目的不光規定實現JVM時它內部的體繫結構,更重要的是提供了一種方式,用於嚴格定義實現時的外部行為。每個JVM都有兩種機制,一個是裝載具有合適名稱的類(類或是介面),叫做類裝載子系統;另外的一個負責執行包含在已裝載的類或介面中的指令,叫做運行引擎。每個JVM又包括方法區、堆、 Java棧、程式計數器和本地方法棧這五個部分,這幾個部分和類裝載機制與運行引擎機制一起組成的體繫結構圖為:
......餘下全文>>
java虛擬機器工作原理圖解
Java虛擬機器
一、什麼是Java虛擬機器
Java虛擬機器是一個想象中的機器,在實際的電腦上通過軟體類比來實現。Java虛擬機器有自己想象中的硬體,如處理器、堆棧、寄存器等,還具有相應的指令系統。
1.為什麼要使用Java虛擬機器
Java語言的一個非常重要的特點就是與平台的無關性。而使用Java虛擬機器是實現這一特點的關鍵。一般的進階語言如果要在不同的平台上運行,至少需要編譯成不同的目標代碼。而引入Java語言虛擬機器後,Java語言在不同平台上運行時不需要重新編譯。Java語言使用模式Java虛擬機器屏蔽了與具體平台相關的資訊,使得Java語言編譯器只需產生在Java虛擬機器上啟動並執行目標代碼(位元組碼),就可以在多種平台上不加修改地運行。Java虛擬機器在執行位元組碼時,把位元組碼解釋成具體平台上的機器指令執行。
2.誰需要瞭解Java虛擬機器
Java虛擬機器是Java語言底層實現的基礎,對Java語言感興趣的人都應對Java虛擬機器有個大概的瞭解。這有助於理解Java語言的一些性質,也有助於使用Java語言。對於要在特定平台上實現Java虛擬機器的軟體人員,Java語言的編譯器作者以及要用硬體晶片實現Java虛擬機器的人來說,則必須深刻理解Java虛擬機器的規範。另外,如果你想擴充Java語言,或是把其它語言編譯成Java語言的位元組碼,你也需要深入地瞭解Java虛擬機器。
3.Java虛擬機器支援的資料類型
Java虛擬機器支援Java語言的基礎資料型別 (Elementary Data Type)如下:
byte://1位元組有符號整數的補碼
short://2位元組有符號整數的補碼
int://4位元組有符號整數的補碼
long://8位元組有符號整數的補碼
float://4位元組IEEE754單精確度浮點數
double://8位元組IEEE754雙精確度浮點數
char://2位元組無符號Unicode字元
幾乎所有的Java類型檢查都是在編譯時間完成的。上面列出的未經處理資料類型的資料在Java執行時不需要用硬體標記。*作這些未經處理資料類型資料的位元組碼(指令)本身就已經指出了*作數的資料類型,例如iadd、ladd、fadd和dadd指令都是把兩個數相加,其*作數類型別是int、long、 float和double。虛擬機器沒有給boolean(布爾)類型設定單獨的指令。boolean型的資料是由integer指令,包括integer 返回來處理的。boolean型的數組則是用byte數組來處理的。虛擬機器使用IEEE754格式的浮點數。不支援IEEE格式的較舊的電腦,在運行 Java數值計算程式時,可能會非常慢。
虛擬機器支援的其它資料類型包括:
object//對一個Javaobject(對象)的4位元組引用
returnAddress//4位元組,用於jsr/ret/jsr-w/ret-w指令
注:Java數組被當作object處理。
虛擬機器的規範對於object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對object的引用是一個控制代碼,其中包含一對指標:一個指標指向該object的方法表,另一個指向該object的資料。用Java虛擬機器的位元組碼錶示的程式應該遵守類型規定。Java虛擬機器的實現應拒絕執行違反了類型規定的位元組碼程式。Java虛擬機器由於位元組碼定義的限制似乎只能運行於32位地址空間的機器上。但是可以建立一個Jav......餘下全文>>