程序計數器 |
Program Counter Register |
當前線程鎖執行的字節碼的行號指示器 |
對於Java方法,記錄的是正在執行的虛擬機字節碼指令的地址,對於Natice方法,計數器值爲空 |
無 |
線程私有,對於每一個線程都具有自己的一個計數器用於在線程切換情況下的恢復 |
Java虛擬機棧 |
Java Virtual Machine Stacks |
Java方法的執行內存模型 |
每個java方法會對應一個棧幀,存放局部變量表,操作數棧,動態鏈接,方法出口 |
StackOverflowError:如果申請的棧深度大於虛擬機所允許的深度,OutOfMemoryError:如果動態拓展時無法申請到足夠的內存 |
線程私有,與線程生命週期相同 |
本地方法棧 |
Native Method Stacks |
Native方法執行的內存模型 |
同上 |
同上 |
同上 |
Java堆 |
Java Heap |
用於存放對象實例 |
1.數組也是在堆上進行分配的2.Java8中字符串常量池被放入堆中3.分爲新生代和老生代 |
OutOfMemoryError:堆中沒有內存進行實例分配並且不能在進行動態拓展時 |
所有線程共享 |
方法區 |
Method Area |
存儲虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼 |
1所謂的永久代2可以不進行垃圾收集的區域,垃圾回收效果一般不好 |
OutOfMemoryError:堆中沒有內存進行實例分配並且不能在進行動態拓展時 |
所有線程共享 |
運行時常量池 |
Runtime Constant Pool |
方法區的一部分,用於存放編譯期生成的各種字面量和符號引用 |
無 |
OutOfMemoryError:堆中沒有內存進行實例分配並且不能在進行動態拓展時 |
所有線程共享 |
直接內存 |
Direct Memory |
不是java虛擬機運行時數據區的一部分,稱爲堆外內存 |
無 |
OutOfMemoryError:各個內存區域總和大於物理內存限制 |
無 |