Java虛擬機定義了若干種程序運行期間會使用到的運行時數據區,其中有一些會隨著虛擬機啟動而創建,隨著虛擬機退出而銷毀.另外一些是與線程一一對應的,這些與線程對應的數據區域隨著線程的開始和結束而創建和銷毀
一,PC寄存器---與線程相關
Java 虛擬機可以支持多條線程同時執行,每一條 Java虛擬機線程都有自己的 PC(Program Counter)寄存器。在任意時刻,一條 Java 虛擬機線程只會執行一個方法的代碼,這個正在被線程執行的方法稱為該線程的當前方法。如果這個方法不是 native 的,那 PC 寄存器就保存 Java 虛擬機正在執行的字節碼指令的地址,如果該方法是 native 的,那 PC 寄存器的值是 undefined。PC 寄存器的容量至少應當能保存一個 returnAddress 類型的數據或者一個與平臺相關的 地指針的值。
二,Java虛擬機棧和棧幀---與線程相關
1,Java虛擬機棧(JVM Stack)
每一條 Java 虛擬機線程都有自己私有的 Java 虛擬機棧(Java Virtual Machine Stack),這個棧與線程同時創建,用于存儲棧幀-
2,棧幀(Frame)
- 棧幀(Frame)是用來存儲數據和部分過程結果的數據結構,同時也被用來處理動態鏈接(Dynamic Linking)、方法返回值和異常分派(Dispatch Exception)。
- 棧幀隨著方法調用而創建,隨著方法結束而銷毀——無論方法是正常完成還是異常完成(拋出了在方法內 被捕獲的異常)都算作方法結束。棧幀的存儲空間分配在 Java 虛擬機棧之中,每一個棧幀都有自己的局部變量表(Local Variables)、操作數棧(OperandStack)和指向當前方法所屬的類的運行時常量池的引用。
- 在一條線程之中,只有目前正在執行的那個方法的棧幀是活動的。這個棧幀就被稱為是當前棧幀(Current Frame),這個棧幀對應的方法就被稱為是當前方法(Current Method),定義這個方法的類就稱作當前類(Current Class)。對局部變量表和操作數棧的各種操作,通常都指的是對當前棧幀的對局部變量表和操作數棧進行的操作。
- 棧幀是線程 地私有的數據,不可能在一個棧幀之中引用另外一條線程的棧幀。
三,Java堆(Heap)---與JVM相關
Java 堆在虛擬機啟動的時候就被創建
在 Java 虛擬機中,堆(Heap)是可供各條線程共享的運行時內存區域,也是供所有類實例和數組對象分配內存的區域。這塊區域內存就是被垃圾回收器所管理的
四,方法區(Method Area)---與JVM相關
在 Java 虛擬機中,方法區(Method Area)是可供各條線程共享的運行時內存區域.方法區在虛擬機啟動的時候被創建,方法區是堆的邏輯組成部分.
方法區與傳統語言中的編譯代碼儲存區(Storage Area Of Compiled Code)或者操作系統進程的正文段(Text Segment)的作用非常類似,它存儲了每一個類的結構信息,常量,靜態變量,即時編譯器編譯后的代碼等數據.例如運行時常量池(Runtime Constant Pool)、字段和方法數據、構造函數和普通方法的字節碼內容、還包括一些在類、實例、接口初始化時用到的特殊方法。
五,運行時常量池(Runtime Constant Pool)---與JVM相關
運行時常量池(Runtime Constant Pool)是每一個類或接口的常量池的運行時表示形式,它包括了若干種不同的常量:從編譯期可知的數值字面量到必須運行期解析后才能獲得的方法或字段引用,例如,存放編譯期生成的各種字面量和符號引用。運行時常量池扮演了類似傳統語言中符號表(SymbolTable)的角色,不過它存儲數據范圍比通常意義上的符號表要更為廣泛。
每一個運行時常量池都分配在 Java 虛擬機的方法區之中,在類和接口被加載到虛擬機后,對應的運行時常量池就被創建出來。
六,本地方法棧---與線程相關
Java 虛擬機實現可能會使用到傳統的棧(通常稱之為“C Stacks”)來支持 native 方法(指使用 Java 以外的其他語言編寫的方法)的執行,這個棧就是 本地方法棧(Native Method Stack)。當 Java 虛擬機使用其他語言(例如 C 語言)來實現指令集解釋器時,也會使用到 地方法棧。如果 Java 虛擬機不支持 natvie 方法,并且自己也不依賴傳統棧的話,可以無需支持 地方法棧,如果支持 地方法棧,那這個棧一般會在線程創建的時候按線
總之
- 程序計數器,JAVA虛擬機棧(棧幀是存放在JAVA虛擬機棧中的,隨著方法的調用而生,方法結束而消亡),本地方法棧是隨著線程創建而生,線程結束而消亡.
- JAVA堆和本地方法區(運行時常量池是在本地方法區中的)是隨著虛擬機啟動而創建,隨著虛擬機結束而消亡
參考<<JAVA虛擬機規范>>