Java 虛擬機學習----體系結構 內存模型

  1. JVM體系結構

    這裏寫圖片描述

  2. 運行時內存區
    class 字節碼文件通過類裝載器加載,在運行時的數據區包括方法區 (Method Area) 、虛擬機棧 (VM Stack) 、本地方法棧 (Native Method Stack) 、堆 (Heap) 、程序計數器 (Program Couter Register)。

    • 方法區 (Method Area) :主要用於存儲類的結構信息、運行常量池(runtime constant pool)、靜態變量、方法代碼、方法數據等。是所有線程共享的。方法區邏輯上屬於堆的一部分,但又與堆進行區分,通常又叫“非堆”。
      • 運行常量池(runtime constant pool):是class 文件中每一個類或接口的常量池表(constant_pool table)的運行時表示形式,包括若干種不同的常量,從編譯期可知的數值字面量到必須在運行期解析後才能獲得的方法或字段引用。每一個運行時常量池在Java 虛擬機的方法區中分配。
    • Java 虛擬機棧 (JAVA Virtual Machine Stack) :是描述 Java 方法執行的內存模型。每個線程有一個私有的棧,隨着線程創建而建立,主要用於存放一種叫“棧幀”的東西。每個方法被執行時會創建一個“棧幀”,用於存儲局部變量表(基本數據類型和對象引用)、操作數棧、方法出口等信息。每個方法被調用到執行完的過程,就對應着一個棧幀在虛擬機中從入棧到出棧的過程。棧的大小可以固定也可以動態擴展。當棧調用深度大於JVM所允許的範圍,會拋出StackOverflowError異常,不過,這個深度範圍不是一個恆定的值。另外,當申請不到空間時,會拋出OutOfMemorryError 異常。

      • 棧幀(frame):是用來存儲數據和部分過程結果的數據結構,同時也用來處理動態鏈接(dymanic linking),方法返回值,異常分派(dispatch excepiton)。棧幀是隨着方法的調用而創建,隨着方法結束而銷燬。棧幀是線程本地私有的數據,沒可能在一個棧幀只用引用另一個線程的棧幀。
    • 本地方法棧 (Native Method Stack) :Java 虛擬機實現可能會用使用到傳統的棧(C Stack)支持native 方法。當 Java 虛擬機使用到其他語言(例如 C 語言)來實現指令集解釋器時,也可以使用本地方法棧,與虛擬機棧基本類似,區別在於虛擬機棧爲虛擬機執行的Java 方法服務,而本地方法則是爲Native方法服務。

    • 堆 (Heap) :也叫Java 堆,是可供各個線程共享的運行時內存區域。在虛擬機啓動的時候就被創建,存儲了被自動內存管理系統garbage collector(垃圾收集器),是Java虛擬機所管理的內存中最大的一塊內存區域。提供類實例和數組對象分配內存的區域。 Java 堆的容量可以是固定的,也可以隨着程序執行的需求動態擴展,並不需要過多空間時自動收縮。如果實際所需的堆超過了自動內存管理系統提供的最大容量,會拋出一個OutOfMemorryError異常

    • 程序計數器 (Program Couter Register) :也叫PC寄存器,,每一條 Java 虛擬機線程都有自己的 PC寄存器,在任意時刻,一條虛擬機線程只會執行一個方法代碼,這個正在被線程執行的方法成爲線程的當前方法。作用是當前線程所執行的字節碼的行號指示器,在虛擬機的模型裏,字節碼解釋器的工作就是通過該表這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、異常處理、線程恢復等基礎功能都是依賴計數器完成的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章