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)連接使用。
- 前面的解析過程其實(shí)是靜態(tài)解析;
- 對(duì)于運(yùn)行期轉(zhuǎn)化為直接引用,稱為動(dòng)態(tài)解析。
-
方法返回地址
- 正常退出,執(zhí)行引擎遇到方法返回的字節(jié)碼,將返回值傳遞給調(diào)用者
- 異常退出,遇到Exception,并且方法未捕捉異常,那么不會(huì)有任何返回值。
額外附加信息,虛擬機(jī)規(guī)范沒有明確規(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ò)展到無法申請(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)行期間,將新的常量加入常量池,比較常見的是String類的intern()方法。
字面量:與Java語言層面的常量概念相近,包含文本字符串、聲明為final的常量值等。
-
符號(hào)引用:編譯語言層面的概念,包括以下3類:
- 類和接口的全限定名
- 字段的名稱和描述符
- 方法的名稱和描述符