在java虛擬機(jī)JVM中,內(nèi)存空間的粗略分配如下圖所示:
我們可以這樣理解: 1、JVM內(nèi)存包含堆區(qū)(Heap)和非堆區(qū)( Code Cache(代碼緩存區(qū))、Perm Gen(永久代)、Jvm Stack(Java虛擬機(jī)棧)、Local Method Statck(本地方法棧)), 2、堆區(qū)又包含老一代區(qū)(Old Memory)和幼年區(qū)(Yong Gen), 3、幼年區(qū)又分為Eden Space(伊甸園)、Survivor Space(幸存者區(qū)), 4、Survivor Space(幸存者區(qū))有兩塊區(qū)域S0和S1,
為什么要這樣分呢? 1、為什么要區(qū)分新生代和老生代? 堆中區(qū)分的新生代和老年代是為了垃圾回收,新生代中的對(duì)象存活期一般不長(zhǎng),而老年代中的對(duì)象存活期較長(zhǎng),所以當(dāng)垃圾回收器回收內(nèi)存時(shí),新生代中垃圾回收效果較好,會(huì)回收大量的內(nèi)存,而老年代中回收效果較差,內(nèi)存回收不會(huì)太多。 2、不同代采用的算法區(qū)別? 基于以上特性,新生代中一般采用復(fù)制算法,因?yàn)榇婊钕聛?lái)的對(duì)象是少數(shù),所需要復(fù)制的對(duì)象少,而老年代對(duì)象存活多,不適合采用復(fù)制算法,一般是標(biāo)記整理和標(biāo)記清除算法。 因?yàn)閺?fù)制算法需要留出一塊單獨(dú)的內(nèi)存空間來(lái)以備垃圾回收時(shí)復(fù)制對(duì)象使用,所以將新生代分為eden區(qū)和兩個(gè)survivor區(qū),每次使用eden和一個(gè)survivor區(qū),另一個(gè)survivor作為備用的對(duì)象復(fù)制內(nèi)存區(qū)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注