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