(1) JVM系列--內(nèi)存區(qū)域

一. JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)

java 虛擬機(jī)在執(zhí)行java程序的時(shí)候,會(huì)將內(nèi)存劃分為若干個(gè)不同的區(qū)域,都各自有自己的用途,下圖是java 虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)圖:

java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū).jpg

1 方法區(qū)

該區(qū)主要用來存儲(chǔ)已被虛擬機(jī)加載的類信息,常量,靜態(tài)變量,以及JIT編譯完之后的代碼等,很多人將方法區(qū)稱為"永久代",其實(shí)兩者是不等價(jià)的,僅僅是將GC分代收集擴(kuò)展到方法區(qū),這樣hotSpot 的垃圾回收器就可以像管理java堆一樣管理這部分內(nèi)存,對(duì)于JRocket,J9,是沒有這個(gè)概念的。

2 虛擬機(jī)棧

線程私有的,生命周期和線程一樣,描述了java 方法執(zhí)行的內(nèi)存模型,用棧幀來存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口,方法執(zhí)行對(duì)應(yīng)了進(jìn)棧和出棧,這邊規(guī)定了StackOverflowError : 線程所請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度,以及由于支持動(dòng)態(tài)拓展之后出現(xiàn)的無法申請(qǐng)到足夠的內(nèi)存而拋出的OutOfMemoryError.

3 本地方法棧

虛擬機(jī)使用的Native方法服務(wù),與虛擬機(jī)棧類似,也會(huì)拋StackoverflowError以及OutOfMemoryError.

4 java堆

虛擬機(jī)管理的內(nèi)存中最大的一塊,是所有線程共享的一塊區(qū)域,"幾乎"所有的對(duì)象實(shí)例都是在這里分配內(nèi)存,隨著JIT的發(fā)展與逃逸分析技術(shù)成熟,棧上分配,標(biāo)量替換等使得對(duì)象的分配都在堆上面變得不是那么絕對(duì)。這一塊也是GC回收器管理的主要區(qū)域,java堆空間可劃分為:新生代和老年代,再細(xì)分就是,新生代里面可以又劃分為:Eden區(qū),F(xiàn)rom Survivior,To Survivor. 這邊還有一個(gè)是TLAB(Thread Local Allocation Buffer), 在堆中創(chuàng)建出來的多個(gè)線程私有的分配緩沖區(qū)。

5 程序計(jì)數(shù)器

當(dāng)前線程執(zhí)行的字節(jié)碼的行號(hào)指示器,各個(gè)線程之間都獨(dú)立存儲(chǔ)私有這一塊內(nèi)存區(qū)域,注意當(dāng)執(zhí)行的Native方法時(shí),該計(jì)數(shù)器為空,也是唯一一個(gè)在java 虛擬機(jī)規(guī)范中沒有規(guī)定任何的OutOfMemoryError的區(qū)域。

二. 非JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)

1 直接內(nèi)存

并不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域,java 通過在堆中的DirectByteBuffer 對(duì)象作為這塊內(nèi)存的引用進(jìn)行操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容