垃圾收集算法
1、標(biāo)記-清除算法(mark-sweep)
首先標(biāo)記出所有需要回收的對(duì)象,在標(biāo)記完成后統(tǒng)一進(jìn)行回收所有被標(biāo)記對(duì)象
存在問題:
1、效率問題,標(biāo)記和清除兩個(gè)過程效率不高
2、空間問題,標(biāo)記清除后產(chǎn)生大量不連續(xù)內(nèi)存碎片,空間碎片太多可能導(dǎo)致程序后續(xù)分配大對(duì)象時(shí),提前觸發(fā)gc
2、標(biāo)記-整理算法(mark-compat)
標(biāo)記出所有需要回收的對(duì)象,標(biāo)記完成后,讓所有存活對(duì)象都向一端移動(dòng),直接清理掉端邊界以外的內(nèi)存。
標(biāo)記-整理算法在標(biāo)記-清除算法基礎(chǔ)上,又進(jìn)行對(duì)象移動(dòng),因此成本更高,但解決內(nèi)存碎片問題。該垃圾回收算法適用于對(duì)象存活率搞得場(chǎng)景(老年代)
3、復(fù)制算法
復(fù)制算法將可用內(nèi)存容量劃分為大小相等兩塊,每次只使用其中一塊,當(dāng)一塊內(nèi)存用完,就將存貨的對(duì)象復(fù)制到另外一塊上面,然后再把已使用過的內(nèi)存空間一次清理掉。算法適用于對(duì)象存活率低的場(chǎng)景,比如新生代。
IBM公司研究,新生代中的對(duì)象98%朝生夕死,分配比例8:1
Eden:Survivor0:Survivor1= 8:1:1。意外情況需要依賴其他內(nèi)存(老年代)進(jìn)行分配擔(dān)保
4、分代收集算法
根據(jù)對(duì)象生存周期不同將內(nèi)存進(jìn)行劃分。
新生代對(duì)象存活率低,采用復(fù)制算法
老年代存活率高,就采用標(biāo)記-清除算法或標(biāo)記-整理算法
1、新生代
1.所有新生成的對(duì)象首先都是放在新生代的。新生代的目標(biāo)就是盡可能快速的收 集掉那些生命周期短的對(duì)象。
2.新生代內(nèi)存按照 8:1:1 的比例分為一個(gè) eden 區(qū)和兩個(gè) survivor(survivor0,survivor1)區(qū)。大部分對(duì)象在 Eden 區(qū)中生成?;厥諘r(shí)先將 eden 區(qū)存活對(duì)象復(fù)制到一個(gè) survivor0 區(qū),然后清空 eden 區(qū),當(dāng)這個(gè) survivor0 區(qū)也 存放滿了時(shí),則將 eden 區(qū)和 survivor0 區(qū)存活對(duì)象復(fù)制到另一個(gè) survivor1 區(qū), 然后清空 eden 和這個(gè) survivor0 區(qū),此時(shí) survivor0 區(qū)是空的,然后將 survivor0 區(qū)和 survivor1 區(qū)交換,即保持 survivor1 區(qū)為空, 如此往復(fù)。
3.當(dāng) survivor1 區(qū)不足以存放 eden 和 survivor0 的存活對(duì)象時(shí),就將存活對(duì)象直 接存放到老年代。若是老年代也滿了就會(huì)觸發(fā)一次 Full GC,也就是新生代、老
年代都進(jìn)行回收。
4.新生代發(fā)生的 GC 也叫做 Minor GC,MinorGC 發(fā)生頻率比較高(不一定等 Eden 區(qū)滿了才觸發(fā))。2、老年代
1.在老年代中經(jīng)歷了 N 次垃圾回收后仍然存活的對(duì)象,就會(huì)被放到老年代中。因 此,可以認(rèn)為老年代中存放的都是一些生命周期較長(zhǎng)的對(duì)象。
2.內(nèi)存比新生代也大很多(大概比例是 1:2),當(dāng)老年代內(nèi)存滿時(shí)觸發(fā) Major GC, 即 Full GC。Full GC 發(fā)生頻率比較低,老年代對(duì)象存活時(shí)間比較長(zhǎng)。3、持久代
永久代主要存放靜態(tài)文件,如java類,方法,永久代對(duì)垃圾回收沒有顯著影響
-
4、垃圾回收有兩種類型,Minor GC 和 Full GC。
Minor GC:對(duì)新生代進(jìn)行回收,不會(huì)影響到年老代。因?yàn)樾律?Java 對(duì)象大多死亡頻繁,所以 Minor GC 非常頻繁,一般在這里使用速度快、效率高的算法,使垃圾回收能盡快完成。
Full GC:也叫 Major GC,對(duì)整個(gè)堆進(jìn)行回收,包括新生代和老年代。由于Full GC需要對(duì)整個(gè)堆進(jìn)行回收,所以比Minor GC要慢,因此應(yīng)該盡可能減少Full GC的次數(shù),導(dǎo)致Full GC的原因包括:老年代被寫滿、永久代(Perm)被寫滿和System.gc()被顯式調(diào)用等。
5、垃圾收集器
