Java虛擬機運行時數據區

Java虛擬機運行時數據區


程序計數器(Program Counter Register):

  • 線程私有
  • 唯一一塊不規定OutOfMemoryError的內存區域
  • 當前線程所執行的字節碼的行號指示器
  • 執行Java方法時,記錄虛擬機字節碼指令的地址
  • 執行Native方法時,值爲空(Undefined)

虛擬機棧(Virtual Machine Stacks):

  • 線程私有
  • 描述Java方法執行的內存模型(Java Memory Model, JMM),即當Java方法執行時,Java虛擬機會同時創建一個棧幀(Stack Frame),用於存儲局部變量表、操作數棧、動態鏈接、方法出口等
  • 每個Java方法從調用到執行完成的過程,可以看作棧幀在虛擬機中入棧到出棧的過程
  • 棧的最大請求深度大於虛擬機允許深度時,拋出StackOverflowError異常
  • 允許動態擴展時,無法申請道足夠內存,拋出OutOfMemoryError異常

本地方法棧(Native Method Stacks):

  • 線程私有
  • 與虛擬機棧很像,虛擬機棧爲Java方法服務,而本地方法棧爲虛擬機執行的Native方法服務

Java堆(Java Heap):

  • 線程共享
  • 虛擬機中內存最大的區域
  • 虛擬機啓動時創建
  • 存儲對象實例,幾乎所有的對象實例都由Java堆進行內存分配
  • 既然管理內存分配,那也就跟內存回收相關:垃圾收集器的主要管理區域,又名GC堆(Garbage Collected Heap)
  • 若堆中沒有內存完成實例分配,且不能進行擴展時,拋出OutOfMemoryError異常

方法區(Method Area):

既然有對象實例存放的區域,則有對應相關信息存放的區域

  • 線程共享
  • 存放虛擬機加載的類信息、常量、靜態變量、即時編譯器(JIT)編譯後的代碼等
  • 被描述爲Java堆的一個邏輯部分,又名Non-Heap
  • 虛擬機方法區無法滿足內存需求時,拋出OutOfMemoryError異常

運行時常量池(Runtime Constant Pool):

  • 方法區的一部分
  • class(字節碼)文件中有一部分爲常量池(Constant Pool Table),其存儲了編譯期生成的各種字面量符號引用,在類加載後,這些信息會進入方法區的運行時常量池存放。
字面量(literal)和符號引用(Symbolic References):
  • 字面量接近於Java語言層面的常量概念,如文本字符串,聲明爲final的常量值等
  • 符號引用屬於編譯原理方面的概念,包括三類常量:
    – 類和接口的全限定名(Fully Qualified Name)
    – 字段的名稱和描述符(Descriptor)
    – 方法的名稱和描述符
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章