一、運(yùn)行時(shí)數(shù)據(jù)區(qū)
1、程序計(jì)數(shù)器:線程私有,當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,存儲的是下一條需要執(zhí)行的字節(jié)碼指令,比如分支、循環(huán)、異常處理等。
2、虛擬機(jī)棧:線程私有,生命周期與線程同相同,描述的是 Java 方法執(zhí)行的內(nèi)存模型:每個(gè)方法在執(zhí)行時(shí)會創(chuàng)建一個(gè)棧幀,用于存放局部變量表等,每個(gè)方法執(zhí)行過程就是棧幀的入棧和出棧的過程。如果線程請求的棧深度大于允許的深度,就會拋出 StackOverflowError。
3、本地方法棧:線程私有,與虛擬機(jī)棧作用類型,區(qū)別在于:虛擬機(jī)棧執(zhí)行的是 Java 方法(也就是字節(jié)碼)服務(wù),而本地方法棧則為虛擬機(jī)使用到的 Native 方法服務(wù)。(PS:Sun HotSpot 虛擬機(jī)直接把本地方法棧和虛擬機(jī)棧合二為一了)
4、堆:線程共享,虛擬機(jī)啟動時(shí)分配內(nèi)存,存放所有對象實(shí)例及數(shù)組。垃圾收集器管理的主要區(qū)域。堆空間在物理上可能是不連續(xù)的。如果在堆中沒有可用內(nèi)存完成實(shí)例分配,會拋出 OutOfMemoryError。
5、方法區(qū):線程共享,存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量等數(shù)據(jù)。(方法區(qū)相當(dāng)于一個(gè)特殊的堆,內(nèi)存管理是個(gè)大問題,垃圾收集器也會掃這里,但回收“成績”比較差,用超了也會?OutOfMemoryError。)
6、運(yùn)行時(shí)常量池:線程共享,是方法區(qū)的一部分,存儲編譯器生成的各種字面量和符號引用,也可以在運(yùn)行期間存入,比如:String.intern(),用超了也會?OutOfMemoryError。
7、直接內(nèi)存:也叫堆外內(nèi)存,超過機(jī)器物理內(nèi)存,也會?OutOfMemoryError。NIO使用的就是堆內(nèi)引用+堆外內(nèi)存方式。

