程序計數器
- 線程私有
- 指向了正在執行的虛擬機字節碼指令的地址;如果是本地方法,數值爲空
- 沒有 OutOfMemoryError 錯誤的區域
Java虛擬機棧
- 線程私有;
- 生命週期與線程相同;
- 代表着 Java 方法執行的內存模型:每個方法執行時的同時會創建一個棧幀(Stack Frame)用於存放***局部比量表、操作數棧、動態鏈接、方法出口***等信息。
- 每個方法從調用到執行完畢的過程,對應着每一個棧幀在虛擬機棧中入棧到出棧的過程。
- 如果線程請求的棧深度大於虛擬機允許的深度,跑出 StackOverflowError 異常;無法申請到足夠的內存,拋出 OutOfMemoryError 錯誤。
本地方法棧
- 線程私有;
- 和 Java 虛擬機棧類似,但是是爲 Native 方法服務。
Java 堆
- 線程共享;
- Java 虛擬機中內存最大的一塊;
- 惟一的作用是存放對象實例:所有的對象實例以及數組都要在堆上分配;
- 是垃圾收集器的主要區域。詳細區分的話,可以分爲新生代和老年代,再細緻的話,可以分爲 Eden 空間、 From Surivor 空間、 To Surivor 空間;
- Java 堆可以處於物理上不連續的內存空間中,只要邏輯是連續的即可。 主流的虛擬機通過 -Xms 和***-Xmx***控制;
- 如果堆中沒有內存完成實例分配,並且堆無法再拓展時,拋出 OutOfMemoryError 錯誤。