在每天一個知識點(1)中介紹了虛擬機的組成上包含運行時數(shù)據(jù)區(qū)巫延。
Java虛擬機在執(zhí)行Java程序的過程中效五,會將涉及的數(shù)據(jù)劃分到不同的內(nèi)存區(qū)域去管理,而這部分區(qū)域就是我們接下來要主要講解的運行時數(shù)據(jù)區(qū)烈评。
運行時數(shù)據(jù)區(qū)在組成上又分為以下幾部分:
- 程序計數(shù)器:該區(qū)域占用內(nèi)存很小火俄,主要是存儲當前線程執(zhí)行的字節(jié)碼行數(shù),作用時當cpu在不同線程間切換時讲冠,保證切換回來后通過程序計數(shù)器接著之前繼續(xù)運行瓜客。該區(qū)域是虛擬機中唯一沒有規(guī)定oom的區(qū)域,該區(qū)域是線程私有的竿开,一個線程會對應(yīng)一個程序計數(shù)器谱仪。
- 虛擬機棧:是線程私有內(nèi)存,虛擬機棧描述的是java方法執(zhí)行的內(nèi)存模型否彩。整個線程執(zhí)行過程中疯攒,每個方法對應(yīng)著虛擬機棧中的一個棧幀,用于存儲局部變量表列荔、操作數(shù)棧敬尺、動態(tài)鏈接、方法出口等信息贴浙,方法調(diào)用對應(yīng)著一個棧幀的入棧砂吞,方法執(zhí)行結(jié)束對應(yīng)著一個棧幀的出棧。
- 本地方法棧:和虛擬機棧功能上一致崎溃,區(qū)別是虛擬機棧為java方法服務(wù)蜻直,本地方法棧為native方法服務(wù)。
- 堆:是線程共享的內(nèi)存區(qū)域,創(chuàng)建的對象都存儲在該區(qū)域概而,垃圾回收器作用在該區(qū)域呼巷。因此從GC的角度,該區(qū)域又分為老年代赎瑰、年輕代王悍,年輕代又分為Eden 區(qū)、From Survivor 區(qū)和 To Survivor 區(qū)乡范。
- 方法區(qū):也被稱為永久代配名,是線程共享的內(nèi)存區(qū)域,主要是存儲被 JVM 加載的類信息晋辆、常量渠脉、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)瓶佳;該區(qū)域也有垃圾回收芋膘,回收目標是常量池和不再使用的類的卸載。