標籤:cte werror 異常 一個棧 java memory 介面 flow 部分
運行時資料區域
(1)程式計數器(program counter register)
一塊較小的記憶體空間
當前線程所執行的位元組碼的行號指標,位元組碼解譯器在工作的時候就是通過改變程式計數器的值來選取下一跳要執行的指令
多線程環境下,線程輪流切換執行,程式計數器保證線程切換之後能恢複到正確的位置
每個線程都有一個獨立的程式計數器
線程私人
沒有任何異常
(2)虛擬機器棧(stack)
虛擬機器棧描述的是Java方法執行的記憶體模型:每個方法在執行的過程中都會建立一個棧幀,用於儲存局部變數表、運算元棧、動態連結、方法出口等資訊
局部變數表中存放了編譯期間可知的各種資料類型:boolean byte char short int float long double 對象引用(long和double佔用兩個局部變數空間slot)
局部變數表的大小在編譯期間確定
線程私人
StackOverflowError:線程請求棧的深度大於虛擬機器允許的棧的深度
OutOfMemoryError:Java虛擬機器棧動態擴充時無法申請到足夠的記憶體
(3)本地方法棧
虛擬機器棧為虛擬機器執行Java方法服務
本地方法棧為虛擬機器執行Native方法服務
(4)堆
線程共用
存放所有的執行個體對象和數組
Java記憶體地區最大的一塊
記憶體回收的主要區域(GC堆)(garbage collected)
堆記憶體可以是物理上不連續的儲存空間、邏輯上連續即可
OutOfMemoryError:堆記憶體擴充時無法擷取到足夠的記憶體
(5)方法區
線程共用
儲存已被虛擬機器載入的類資訊、常量、靜態變數、即使編譯器編譯之後的代碼
OutOfMemoryError:方法區無法滿足記憶體配置的需求時
(6)運行時常量池
方法區的一部分
class檔案中除了有類的版本、欄位、方法、介面等的描述外,還有一項是常量池(constant pool table),用於存放編譯期間產生的各種字面量和符號引用
在類載入之後存放
除了儲存Class檔案中描述的符號引用之外,還會把翻譯出來的直接引用也儲存在常量池中
OutOfMemoryError
Java運行時資料區域(堆 棧 方法區 常量池)