JVM的内存分区
JVM的內(nèi)存分區(qū)
這篇文章嘗試討論清楚JVM的內(nèi)存分區(qū)情況。
1.?????? JVM的內(nèi)存和系統(tǒng)內(nèi)存的關(guān)系
下圖是對(duì)系統(tǒng)內(nèi)存及JVM內(nèi)存的大致描繪
?
對(duì)大多數(shù)操作系統(tǒng),內(nèi)存可以分為物理內(nèi)存RAM及Swap(交換區(qū))兩大部分,Swap Space在物理上是一塊獨(dú)立的磁盤(pán)區(qū)域,當(dāng)操作系統(tǒng)發(fā)現(xiàn)內(nèi)存不夠使用時(shí),便開(kāi)始使用交換區(qū)。
在系統(tǒng)層面,Linux系統(tǒng)的內(nèi)存大致可以劃分為:
一個(gè)JAVA程序開(kāi)始運(yùn)行之后,是存在于系統(tǒng)之上的一個(gè)進(jìn)程。這個(gè)進(jìn)程所占用的內(nèi)存由JVM管理。
2.?????? JVM內(nèi)存的劃分
JVM的內(nèi)存可以劃分為以下幾個(gè)主要部分:
?
堆是內(nèi)存回收的主戰(zhàn)場(chǎng),因此由稱為Garbage Collected Heap(GC堆),在分代收集策略下,堆可以進(jìn)一步劃分為新生代和老年代,更細(xì)致的:
- Eden區(qū),對(duì)象第一次創(chuàng)建時(shí),從Eden區(qū)開(kāi)辟空間
- Survivor區(qū),當(dāng)Eden區(qū)不足以進(jìn)行下次內(nèi)存分配時(shí),JVM觸發(fā)一次GC,經(jīng)過(guò)GC但未被回收的對(duì)象,被轉(zhuǎn)移到Survivor區(qū)。Survivor分為From,To兩部分,多次內(nèi)存回收時(shí)未被回收的對(duì)象在這兩塊區(qū)域中來(lái)回轉(zhuǎn)移。
- Old區(qū),當(dāng)經(jīng)過(guò)一定次數(shù)的GC后仍未被回收的對(duì)象,JVM將其轉(zhuǎn)移到老年代區(qū)
4. JVM Stack,JAVA虛擬機(jī)棧,線程私有,其生命周期與對(duì)應(yīng)的線程相同。當(dāng)每個(gè)方法執(zhí)行時(shí),均會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息。每個(gè)方法的執(zhí)行和完成,便對(duì)應(yīng)著Stack Frame在虛擬機(jī)棧中的出棧和入棧的過(guò)程。通常意義上粗糙地將JVM內(nèi)存劃分為堆和棧,其中的棧便指的是JVM Stack.
5. Native Method Stack,本地方法棧,與JVM Stack類似,本地方法棧對(duì)應(yīng)的是Native方法的執(zhí)行管理。
此外,程序運(yùn)行所需要的內(nèi)存開(kāi)辟在JVM的內(nèi)存空間中,也可以直接申請(qǐng)系統(tǒng)內(nèi)存(Directive Memory),但是直接申請(qǐng)的系統(tǒng)內(nèi)存不受JVM的垃圾回收管理,其釋放由系統(tǒng)層面控制,因此對(duì)于不關(guān)注內(nèi)存回收的JAVA程序員來(lái)說(shuō),容易導(dǎo)致內(nèi)存溢出等問(wèn)題的發(fā)生。
轉(zhuǎn)載于:https://www.cnblogs.com/luojiahu/p/8231502.html
總結(jié)
 
                            
                        - 上一篇: U盘容量减少的解决办法
- 下一篇: nginx模块_使用gdb调试nginx
