JVM基礎04-運行時數據區

1. 什麼是運行時數據區?
查看官網描述(JDK8):https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5

翻譯一下就是:Java虛擬機定義了在程序執行期間使用的各種運行時數據區域。其中一些數據區域是在Java虛擬機啓動時創建的(方法區和堆,他們是線程共享的),僅在Java虛擬機退出時才被銷燬。其他數據區域是每個線程的(Java虛擬機棧、本地發放棧、程序計數器,他們是線程私有的)。在創建線程時創建每個線程的數據區域,並在線程退出時銷燬每個數據區域。
注:請回答Java運行時數據區都有哪些?生命週期?

2. Java運行時數據區都有哪些?
2.1 方法區
1)線程共享的,在Java虛擬機啓動時創建,退出時銷燬
2)它存儲每個類的結構,例如運行時常量池,字段(靜態變量)和方法數據,以及方法和構造函數的代碼,包括用於類和實例初始化以及接口初始化的特殊方法
3)儘管方法區域在邏輯上是堆的一部分,也叫非堆(Non-Heap)但簡單的實現可以選擇不進行垃圾回收或壓縮(因爲我們知道堆會進行垃圾回收)。
4)如果方法區無法滿足內存分配時會導致OM(OutOfMemoryError)
注:在JDK8之後這部分叫元空間(meta space)

2.2 堆
1)堆是Java虛擬機管理內存最大的一塊,Java虛擬機啓動時創建,線程共享。
2)堆存放的是對象實例和數組
3)堆可劃分爲老年代和新生代(爲什麼要劃分,我們講JVM模型色時候會仔細講解)

2.3 Java虛擬機棧
1)虛擬機棧是一個線程執行的區域,保存着一個線程中方法的調用狀態。換句話說,一個Java線程的運行狀態,由一個虛擬機棧來保存,所以虛擬機棧肯定是線程私有的,獨有的,隨着線程的創建而創建。
2)每個被線程調用的方法對應於一個棧幀。也就是多調用一個方法對應於一個棧幀在虛擬機棧的壓棧,調用完成後則彈出。
3)理解棧幀:每個棧幀中包括局部變量表、操作數棧、動態鏈接、方法返回地址和附加信息
①局部變量表:方法的局部變量、及參數
②操作數棧:壓棧和出棧的方式存儲操作數
③動態鏈接:棧幀包含一個指向運行時常量池中該棧幀所屬方法的引用,持有這個引用是爲了支持方法調用過程中的動態連接(Dynamic Linking)。
④方法返回地址:方法返回的字節碼指令
圖解如下:


2.4 程序計數器
如果線程正在執行Java方法,則計算器記錄的是正在執行的字節碼指令的地址
如果是本地方法,則計數器爲0

2.5 本地方法棧
Native類型的方法在本地方法棧中執行,Java虛擬機棧可通過動態鏈接來指向本地方法棧執行本地方法。

2.6 堆、方法區、棧的指向關係示例
1)堆指向棧 Object obj=new Object()
2)   方法區指向堆  static Object = new Object()
3)堆指向方法區 this.字段

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