1. 簡(jiǎn)介
-
線程私有區(qū):
- 程序計(jì)數(shù)器: 當(dāng)前線程字節(jié)碼地址。
- 虛擬機(jī)棧: java方法棧幀堪澎。
- 本地方法棧: native方法棧幀。
-
線程共享區(qū):
- Java堆: 存儲(chǔ)對(duì)象。
- 方法區(qū): 存放類信息峻仇、常量、靜態(tài)變量邑商、編譯器編譯后的代碼等數(shù)據(jù)摄咆。
- 常量池: 方法區(qū)的一部分,存放編譯器生成的各種字面量和符號(hào)引用人断。
2. 詳細(xì)分析
2.1 程序計(jì)數(shù)器
當(dāng)線程正在執(zhí)行一個(gè)Java方法時(shí)吭从,PC計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼的地址;當(dāng)線程正在執(zhí)行的一個(gè)Native方法時(shí)恶迈,PC計(jì)數(shù)器則為空(Undefined)涩金。
2.2 虛擬機(jī)棧
java方法的棧幀包括:
局部變量表 (locals大小,編譯期確定)暇仲,一組變量存儲(chǔ)空間步做, 容量以slot為最小單位。
操作棧(stack大小熔吗,編譯期確定)辆床,操作棧元素的數(shù)據(jù)類型必須與字節(jié)碼指令序列嚴(yán)格匹配
-
動(dòng)態(tài)連接, 指向運(yùn)行時(shí)常量池中該棧幀所屬方法的引用桅狠,為了 動(dòng)態(tài)連接使用讼载。
- 前面的解析過(guò)程其實(shí)是靜態(tài)解析;
- 對(duì)于運(yùn)行期轉(zhuǎn)化為直接引用中跌,稱為動(dòng)態(tài)解析咨堤。
-
方法返回地址
- 正常退出,執(zhí)行引擎遇到方法返回的字節(jié)碼漩符,將返回值傳遞給調(diào)用者
- 異常退出一喘,遇到Exception,并且方法未捕捉異常,那么不會(huì)有任何返回值嗜暴。
額外附加信息凸克,虛擬機(jī)規(guī)范沒(méi)有明確規(guī)定,由具體虛擬機(jī)實(shí)現(xiàn)闷沥。
可能會(huì)出現(xiàn)的異常:
StackOverFlowError: 當(dāng)線程請(qǐng)求棧深度超出虛擬機(jī)棧所允許的深度時(shí)拋出
OutOfMemoryError: 部分java虛擬機(jī)會(huì)動(dòng)態(tài)拓展虛擬機(jī)棧萎战,當(dāng)Java虛擬機(jī)動(dòng)態(tài)擴(kuò)展到無(wú)法申請(qǐng)足夠內(nèi)存時(shí)拋出
2.3 本地方法棧
與虛擬機(jī)棧類似,有些java虛擬機(jī)將虛擬機(jī)棧和本地方法棧合二為一舆逃,比如Sun HotSpot虛擬機(jī)蚂维。
2.4 java堆
幾乎存放著所有的對(duì)象實(shí)例和數(shù)組數(shù)據(jù)戳粒。JIT編譯器有棧上分配、標(biāo)量替換等優(yōu)化技術(shù)虫啥,導(dǎo)致部分對(duì)象實(shí)例數(shù)據(jù)不存在Java堆蔚约,而是棧內(nèi)存。
2.5 方法區(qū)
略
2.6 運(yùn)行時(shí)常量池
存放編譯器生成的各種字面量和符號(hào)引用涂籽。運(yùn)行時(shí)常量池除了編譯期產(chǎn)生的Class文件的常量池苹祟,還可以在運(yùn)行期間,將新的常量加入常量池又活,比較常見(jiàn)的是String類的intern()方法苔咪。
字面量:與Java語(yǔ)言層面的常量概念相近锰悼,包含文本字符串柳骄、聲明為final的常量值等。
-
符號(hào)引用:編譯語(yǔ)言層面的概念箕般,包括以下3類:
- 類和接口的全限定名
- 字段的名稱和描述符
- 方法的名稱和描述符