Java筆記之JVM內存區淺析

這篇博文是我看了《深入淺出虛擬機》《虛擬機規範》中的筆記
若有侵權,立即刪除

JAVA虛擬機與java語言沒有必然關係它只與特定的二進制文件格式class文件格式有所關聯。

一個類加載進入虛擬機,虛擬機是如何完成對這個類信息的存儲呢?
接來下我們就對虛擬機的內存區域進行淺顯的分析

首先當虛擬機運行Java 程序時會將內存區劃分爲不同區域
這裏寫圖片描述

1.PC寄存器 (Java虛擬機規範)

此區域是線程私有的(重要)
每一條Java虛擬機的線程都有自己的PC寄存器,
任意時刻一條線程只會執行一個方法代碼
如果這個方法不是native(本地) 那麼PC寄存器保存的就是正在執行字節碼指令的地址。
如果是native方法 PC存儲器的值是undefined。
此區域是唯一沒有規定任何OutOfMemory的區域

2.Java虛擬棧

此區域是線程私有的(重要)
用圖解釋虛擬棧

public class Jvm {
    public static void main(String[] args) {
        Jvm jvm = new Jvm();
        jvm.a();
    }

    void a() {
        b();
    }

    void b() {}
}

首先運行這個Java程序時會創建一個線程來執行,創建此線程時虛擬棧跟着創建完成
虛擬機棧創建好了,開始執行main方法。將main方法加入到虛擬機棧中

這裏寫圖片描述

然後在堆中創建jvm對象。
之後調用a()方法;
a方法加入棧
a方法中又調用b方法
將b方法加入棧

這裏寫圖片描述

這是程序的調用過程
棧中的數據(a方法…)稱爲棧幀
棧幀隨方法的調用而創建隨着方法結束而銷燬
每個棧幀都有自己的本地變量表(局部變量表),操作數棧,以及該方法所屬類的運行常量池。
局部變量表和操作數棧在編譯時期便可以確定。
局部變量表用來保存方法中的屬性。

總之 就是執行方法時 先創建棧幀,棧幀中包含了此方法的數據等等。然後將此棧幀壓入虛擬機棧,然後虛擬機依照先進後出的原則執行棧幀。直到棧爲空程序結束。

3.本地方法棧

用來支持native方法的其餘和虛擬機棧沒啥區別。

4.Java堆

Java堆是線程共享的(重點)
Java堆是在虛擬機啓動時就創建。是垃圾回收器的主要作用區域。
是所有類實例和數組對象分配內存的區域

5.方法區

方法區是線程共享的(重點)
虛擬機啓動時創建。它存儲了每一個類的結構信息。
如:運行常量池,字段,方法數據,構造函數,和普通方法的字節碼內容。

6.運行常量池
由於運行常量池運行時創建的而且運行常量池是在方法區中分配內存的
所以這裏沒有將它加入到內存區中
存儲了從編譯時期可知的數值字面量到必須在運行解析後才能獲取方法或字段的引用。在加載類和接口到虛擬機後就創建對應的運行常量池。

總結
這裏寫圖片描述

水平有限 若有錯誤 歡迎指正重點內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章