天天看點

深入了解java虛拟機-運作時資料區

看圖說話

java運作時資料區模型如上圖。下面我們一起去揭開運作時資料區神秘的面紗。

  • 程式計數器

        一塊較小的記憶體空間,可以看做是目前線程所執行的位元組碼的行号訓示器。在java虛拟機的概念模型中,位元組碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,它是程式控制流的訓示器,分支、跳轉、循環、異常處理、線程恢複等基礎功能都需要依賴這個計數器來完成。

  • java虛拟機棧

        生命周期和線程一緻。每個方法被執行就會同步在虛拟機中同步建立一個棧幀用于存儲局部變量表、操作數棧、動态連接配接、方法出口等資訊。每個方法被調用直至執行完畢的過程,就對應着一個棧幀在虛拟機中從入棧到出棧的過程。

        局部變量表:存放編譯器可知的各種java虛拟機基本資料類型(byte、short、int、long、boolean、char、float、double)、對象引用(reference類型它并不等同于對象本身,可能是一個指向對象起始位址的引用指針,也可能是指向一個代表對象的句柄或者其他與此對象相關的位置)和returnAddress類型(指向了一條位元組碼指令的位址)

        這些資料類型在局部變量表中存儲空間以局部變量槽(slot)來表示,其中64位長度的long和double類型的資料會占用兩個變量槽,其餘的資料類型隻占用一個。

        如果線程請求的棧深度大于虛拟機所允許的深度,将抛出StackOverflowError異常;如果Java虛拟機棧容量可以動态擴充,當棧擴充時無法申請到足夠的記憶體會抛出OutOfMemoryError異常。

  • 本地方法棧
  • 方法區

    擴充:直接記憶體

繼續閱讀