JMM——運行時數據區

Java虛擬機運行時數據區




1 程序計數器(Program Counter Register)

  1.1 程序計數器是一塊較小的線程私有的內存空間,可以看作是當前線程鎖執行的字節碼的行號指示器。

  1.2 如果線程正在執行的是一個Java方法,記錄的是正在執行的虛擬機字節碼指令的地址

  1.3 如果執行的是Native方法,計數器值爲空(Undefined)

  1.4 程序計數器是唯一一個在Java虛擬機規範中沒有規定任何OutOfMemoryError情況的區域


2 Java虛擬機棧

  2.1 線程私有的生命週期和線程相同的內存區域。

  2.2 虛擬機棧描述的是Java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀(Stack Frame)用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息 

  2.3 每一個方法從調用直至執行完成的過程,都對應着一個棧幀在虛擬機棧中入棧到出棧的過程

  2.4 long和double類型的數據會佔用2個局部變量空間(Slot)

  2.5 局部變量表所需的內存空間在編譯期間完成分配,在方法運行期間不會改變局部變量表的大小

  2.6 棧中存放的是基本數據類型和堆中對象的引用(4byte


棧幀的結構圖:


3 本地方法棧

同上,區別就是執行的是本地方法


4 Java堆

在虛擬機啓動時創建

Java堆是被所有線程共享的一塊內存區域也是Java虛擬機鎖管理的內存中最大的一塊

Java堆中存放的是對象


5 方法區

和堆一樣是各個線程共享的內存區域

用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據


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

是方法區的一部分。

存放編譯器生成的各種字面量和符號引用


7 直接內存(Direct Memory)

直接內存並不是虛擬機運行時數據區的一部分,使用Native函數庫直接分配堆外內存

使用DirectByteBuffer對象作爲這塊內存的引用進行操作











發佈了39 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章