- 程序計數器(記錄代碼指令地址)
- Java虛擬機棧(記錄Java方法執行時信息)
- 本地方法棧(記錄Native方法執行時信息)
- 方法區(記錄類信息,常量,靜態變量)
- Java堆(用于對象實例化內存分配)
1.程序計數器
- 記錄當前線程執行的字節碼指令地址
- 線程隔離(及線程私有,每個線程都有一個程序計數器)
- 如當前執行native方法,則計數器值為空
- 不會拋出OutOfMemory(虛擬機規范中無規定)
- 字節碼解釋器通過改變程序計數器的值來選去下一條指令
2.Java虛擬機棧
- Java方法執行的內存模型(一個方法開始執行時,會創建一個棧幀,用來存儲該方法的各種信息,并把棧幀push入棧,在方法執行完成之后,把棧幀pop出棧)
- 線程隔離且生命周期與線程相同
- 會拋出StackOverflow(因為每執行一個方法都會產生一個棧幀入棧,所以調用遞歸方法時會比較容易拋出該異常)
- 會拋出OutOfMemory
3.本地方法棧
- 用于Native方法(作用同Java虛擬機棧)
- 對語言,使用方式,數據結構無限制(所以不一定只能用C和C++,理論上說還可以用Python,甚至Js?)
- 線程隔離且生命周期與線程相同
- 會拋出StackOverflow和OutOfMemory
4.方法區
- 記錄類加載信息,常量,靜態變量等數據
- 推薦實現垃圾回收(類型的卸載,常量的回收,可以不實現)
- 線程共享
- 會拋出OutOfMemory
5.Java堆
- 對象實例的內存分配(幾乎所有對象,但并不絕對)
- 需要實現垃圾回收(該區域為垃圾回收主要區域)
- 線程共享
- 劃分為多個區域(以適應垃圾回收機制的優化)
- 會拋出OutOfMemory
補充
- Java虛擬機棧中的棧幀:存儲存儲局部變量表,操作數棧,動態鏈接,方法出口等信息
- 局部變量表:存儲基本數據類型,對象引用和一條字節碼指令地址returnAddress
- 操作數棧:Java虛擬機的解釋執行引擎基于操作數棧,如某個指令將從棧中pop操作數,執行運算,再將結果push入棧。
- 對象引用:可能是一個指向對象起始地址的指針或是代表對象的句柄或是其他與此對象相關的位置
- 運行時常量池:方法區中的一個區域,保存class文件中的符號引用和翻譯出來的直接引用
對于讀《深入理解Java虛擬機》中內存區域的一個簡單的了解總結。如有錯誤請指出。