- 程序計(jì)數(shù)器(記錄代碼指令地址)
- Java虛擬機(jī)棧(記錄Java方法執(zhí)行時(shí)信息)
- 本地方法棧(記錄Native方法執(zhí)行時(shí)信息)
- 方法區(qū)(記錄類信息诡蜓,常量,靜態(tài)變量)
- Java堆(用于對(duì)象實(shí)例化內(nèi)存分配)
1.程序計(jì)數(shù)器
- 記錄當(dāng)前線程執(zhí)行的字節(jié)碼指令地址
- 線程隔離(及線程私有说订,每個(gè)線程都有一個(gè)程序計(jì)數(shù)器)
- 如當(dāng)前執(zhí)行native方法易遣,則計(jì)數(shù)器值為空
- 不會(huì)拋出OutOfMemory(虛擬機(jī)規(guī)范中無(wú)規(guī)定)
- 字節(jié)碼解釋器通過(guò)改變程序計(jì)數(shù)器的值來(lái)選去下一條指令
2.Java虛擬機(jī)棧
- Java方法執(zhí)行的內(nèi)存模型(一個(gè)方法開(kāi)始執(zhí)行時(shí)先巴,會(huì)創(chuàng)建一個(gè)棧幀致扯,用來(lái)存儲(chǔ)該方法的各種信息,并把棧幀push入棧像街,在方法執(zhí)行完成之后黎棠,把棧幀pop出棧)
- 線程隔離且生命周期與線程相同
- 會(huì)拋出StackOverflow(因?yàn)槊繄?zhí)行一個(gè)方法都會(huì)產(chǎn)生一個(gè)棧幀入棧,所以調(diào)用遞歸方法時(shí)會(huì)比較容易拋出該異常)
- 會(huì)拋出OutOfMemory
3.本地方法棧
- 用于Native方法(作用同Java虛擬機(jī)棧)
- 對(duì)語(yǔ)言镰绎,使用方式脓斩,數(shù)據(jù)結(jié)構(gòu)無(wú)限制(所以不一定只能用C和C++,理論上說(shuō)還可以用Python畴栖,甚至Js随静?)
- 線程隔離且生命周期與線程相同
- 會(huì)拋出StackOverflow和OutOfMemory
4.方法區(qū)
- 記錄類加載信息,常量吗讶,靜態(tài)變量等數(shù)據(jù)
- 推薦實(shí)現(xiàn)垃圾回收(類型的卸載燎猛,常量的回收,可以不實(shí)現(xiàn))
- 線程共享
- 會(huì)拋出OutOfMemory
5.Java堆
- 對(duì)象實(shí)例的內(nèi)存分配(幾乎所有對(duì)象照皆,但并不絕對(duì))
- 需要實(shí)現(xiàn)垃圾回收(該區(qū)域?yàn)槔厥罩饕獏^(qū)域)
- 線程共享
- 劃分為多個(gè)區(qū)域(以適應(yīng)垃圾回收機(jī)制的優(yōu)化)
- 會(huì)拋出OutOfMemory
補(bǔ)充
- Java虛擬機(jī)棧中的棧幀:存儲(chǔ)存儲(chǔ)局部變量表重绷,操作數(shù)棧,動(dòng)態(tài)鏈接膜毁,方法出口等信息
- 局部變量表:存儲(chǔ)基本數(shù)據(jù)類型昭卓,對(duì)象引用和一條字節(jié)碼指令地址returnAddress
- 操作數(shù)棧:Java虛擬機(jī)的解釋執(zhí)行引擎基于操作數(shù)棧,如某個(gè)指令將從棧中pop操作數(shù)瘟滨,執(zhí)行運(yùn)算候醒,再將結(jié)果push入棧。
- 對(duì)象引用:可能是一個(gè)指向?qū)ο笃鹗嫉刂返闹羔樆蚴谴韺?duì)象的句柄或是其他與此對(duì)象相關(guān)的位置
- 運(yùn)行時(shí)常量池:方法區(qū)中的一個(gè)區(qū)域杂瘸,保存class文件中的符號(hào)引用和翻譯出來(lái)的直接引用
對(duì)于讀《深入理解Java虛擬機(jī)》中內(nèi)存區(qū)域的一個(gè)簡(jiǎn)單的了解總結(jié)倒淫。如有錯(cuò)誤請(qǐng)指出。