JVM運行數據區說明

1. JVM運行數據區概覽

jvm運行數據區圖例

在這裏插入圖片描述

圖例說明

  • JVM運行數據區可以劃分爲線程獨佔和線程共享兩部分
  • 線程獨佔(封閉): 每個線程都擁有它的獨立的內存空間,jvm在運行程序時就會爲線程開闢一個內存空間來存儲線程相關的信息,隨着線程生命週期創建和銷燬
  • 線程共享: 所有線程都能夠訪問當前的數據區域,隨着GC的生命週期的創建和銷燬
2. JVM運行數據區分解說明

線程共享

  • 方法區

    • 用於存儲被JVM加載的類信息、常量、靜 態變量、即時編譯器編譯(JIT編譯)後的代碼等數據
    • 屬於一個邏輯區域,根據不同的hotspot VM來實現,如jdk7方法區存放在永久代,而jdk8存放在元數據空間,通過GC機制來對當前區域進行管理
  • 堆內存(也稱爲“主內存”/“共享內存”區域)

    • 劃分爲老年代, 新生代(Eden/From Survivor/To Survivor)
    • JVM啓動的時候會根據系統分配的堆內存策略從計算機申請內存空間,主要用於存儲類實例信息
    • GC回收器本質上是對堆內存的管理
    • 此區域會拋出OutOfMemoryError

線程獨佔

  • 虛擬機棧
    • 描述虛擬機VM在java在線程中執行方法的內存模型,是屬於線程私有的一塊獨立空間線程棧
    • 線程棧包含多個棧幀
    • 一個線程會執行一個或者多個方法,一個方法對應一個棧幀
    • 棧幀內容包含: 局部變量表,操作數棧,動態鏈接,方法回收地址,附加信息等,用來存儲數據和部分結果過程的數據結構,同時也被用來處理動態鏈接,方法返回值和異常分派
    • 棧幀隨着方法的生命週期創建和銷燬(不論是方法正常退出還是異常退出)
    • 會拋出StackOverflowError
  • 本地方法棧
    • 描述虛擬機VM執行用native修飾的方法
    • 虛擬機VM沒有詳細描述其規範,不同的VM將由對應不同的廠商實現
    • 會拋出StaclOverflowError
  • 程序計數器
    • 對於執行native方法,程序計數器存儲爲空
    • 對於執行java方法,程序計數器主要是記錄當前線程執行的字節碼位置,存儲字節碼執行指令的地址
    • 每個線程都會在對應的線程棧創建存儲計數器的空間,目的是記錄執行字節碼指令,因此佔用空間比較少
    • 作用: 就是在同一時刻,同一個CPU執行只能執行一個線程方法,在併發多線程情況下,爲了能夠記住當前線程執行的字節碼指令位置,需要藉助程序計數器來記錄對應的地址,當線程被喚醒的時候,將會根據程序計數器的位置繼續往下執行

參考jvm規範

https://docs.oracle.com/javase/specs/jvms/se13/html/jvms-2.html#jvms-2.5
發佈了72 篇原創文章 · 獲贊 25 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章