一素邪、運行時數據區(qū)
1、程序計數器:線程私有递宅,當前線程所執(zhí)行的字節(jié)碼的行號指示器娘香,存儲的是下一條需要執(zhí)行的字節(jié)碼指令,比如分支办龄、循環(huán)烘绽、異常處理等。
2俐填、虛擬機棧:線程私有安接,生命周期與線程同相同,描述的是 Java 方法執(zhí)行的內存模型:每個方法在執(zhí)行時會創(chuàng)建一個棧幀英融,用于存放局部變量表等盏檐,每個方法執(zhí)行過程就是棧幀的入棧和出棧的過程。如果線程請求的棧深度大于允許的深度驶悟,就會拋出 StackOverflowError胡野。
3、本地方法棧:線程私有痕鳍,與虛擬機棧作用類型硫豆,區(qū)別在于:虛擬機棧執(zhí)行的是 Java 方法(也就是字節(jié)碼)服務龙巨,而本地方法棧則為虛擬機使用到的 Native 方法服務。(PS:Sun HotSpot 虛擬機直接把本地方法棧和虛擬機棧合二為一了)
4熊响、堆:線程共享旨别,虛擬機啟動時分配內存,存放所有對象實例及數組汗茄。垃圾收集器管理的主要區(qū)域秸弛。堆空間在物理上可能是不連續(xù)的。如果在堆中沒有可用內存完成實例分配洪碳,會拋出 OutOfMemoryError递览。
5、方法區(qū):線程共享瞳腌,存儲已被虛擬機加載的類信息非迹、常量、靜態(tài)變量等數據纯趋。(方法區(qū)相當于一個特殊的堆,內存管理是個大問題冷离,垃圾收集器也會掃這里吵冒,但回收“成績”比較差,用超了也會?OutOfMemoryError西剥。)
6痹栖、運行時常量池:線程共享,是方法區(qū)的一部分瞭空,存儲編譯器生成的各種字面量和符號引用揪阿,也可以在運行期間存入,比如:String.intern()咆畏,用超了也會?OutOfMemoryError南捂。
7、直接內存:也叫堆外內存旧找,超過機器物理內存溺健,也會?OutOfMemoryError。NIO使用的就是堆內引用+堆外內存方式钮蛛。