- 程序計數器PC
- 線程私有的
- 它可以看做是當前線程所執行的字節碼的行號指示器
- 內存區域中唯一一個沒有規定任何OutOfMemoryError的區域
- Java虛擬機棧
- 線程私有的
- 每個方法在執行的同時都會創建一個棧幀,用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息
- 如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverFlowError異常;如虛擬機擴展時仍無法申請到足夠的內存,就會拋出OutOfMemoryError異常
- 本地方法棧
與虛擬機棧非常相似,區別是虛擬機棧為虛擬機執行Java方法服務,而本地方法棧則為虛擬機使用Native方法服務
也會拋出StackOverFlowError和OutOfMemoryError異常
- Java堆
- 線程共享的
- Java堆是GC管理的主要區域
- 在虛擬機啟動時創建
- 存放對象實例,幾乎所有的對象實例和數組都在這里分配內存。
- 如果在堆中沒有內存完成實例分配,並且堆也無法再擴展時,將會拋出OutOfMemoryError異常
- 方法區
- 線程共享的
- 用於存儲已被虛擬機加載的類信息、常量、靜態變量、即使編譯器編譯后的代碼等數據
- 當方法區無法滿足內存分配需求時,將拋出OutOfMemoryError異常
- 運行時常量池
- 是方法區的一部分
- 用於存放編譯器生成的各種字面量和符號引用
- 相對於Class文件常量池的一個重要特征是,具備動態性
- 運行時常量池是方法區的一部分,自然受到方法區內存的限制。當常量池無法再申請到內存時會拋出OutOfMemoryError異常