Java執行時資料:
Java虛擬機器棧:
方法執行時建立對應的棧幀用來存放: 區域性變數表、運算元棧、動態連結、方法出口
StackOverflowError:執行緒請求的棧深度大於虛擬機器所允許的深度。
OutOfMemoryError:如果虛擬機器棧可以動態擴充套件,而擴充套件時無法申請到足夠的記憶體。
區域性變數表:
存放方法編譯期可知的各種基本型別,物件引用(reference 型別)和 returnAddress 型別(指向了一條位元組碼指令的地址)
本地方法棧:
本地方法棧為虛擬機器使用到的 Native 方法(非Java語言編寫的方法)服務
StackOverflowError:執行緒請求的棧深度大於虛擬機器所允許的深度。
OutOfMemoryError:如果虛擬機器棧可以動態擴充套件,而擴充套件時無法申請到足夠的記憶體。
Java堆:
這塊區域是 JVM 所管理的記憶體中最大的一塊。執行緒共享,主要是存放物件例項和陣列。可以位於物理上不連續的空間,但是邏輯上要連續。
OutOfMemoryError:如果堆中沒有記憶體完成例項分配,並且堆也無法再擴充套件時,丟擲該異常。
執行緒私有緩衝區(Thread Local Allocation Buffer, TLAB):
每個執行緒分配在Java堆中的非共享緩衝區。在例項化Java物件時保證執行緒安全,詳見指標碰撞與空閒列表
程式計數器:
位元組碼直譯器改變程式計數器的值來儲存執行緒正在執行的虛擬機器位元組碼指令的地址。分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴程式計數器完成。執行緒私有。
方法區:
屬於共享記憶體區域,儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的機器碼等資料。