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對象作爲這塊內存的引用進行操作