直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结
BAT必考JVM系列專(zhuān)題
直通BAT必考題系列:深入詳解JVM內(nèi)存模型與JVM參數(shù)詳細(xì)配置?
垃圾回收算法
1.標(biāo)記清除
標(biāo)記-清除算法將垃圾回收分為兩個(gè)階段:標(biāo)記階段和清除階段。
在標(biāo)記階段首先通過(guò)根節(jié)點(diǎn)(GC Roots),標(biāo)記所有從根節(jié)點(diǎn)開(kāi)始的對(duì)象,未被標(biāo)記的對(duì)象就是未被引用的垃圾對(duì)象。然后,在清除階段,清除所有未被標(biāo)記的對(duì)象。
適用場(chǎng)合:
- 存活對(duì)象較多的情況下比較高效
- 適用于年老代(即舊生代)
缺點(diǎn):
- 容易產(chǎn)生內(nèi)存碎片,再來(lái)一個(gè)比較大的對(duì)象時(shí)(典型情況:該對(duì)象的大小大于空閑表中的每一塊兒大小但是小于其中兩塊兒的和),會(huì)提前觸發(fā)垃圾回收
- 掃描了整個(gè)空間兩次(第一次:標(biāo)記存活對(duì)象;第二次:清除沒(méi)有標(biāo)記的對(duì)象)
2.復(fù)制算法
從根集合節(jié)點(diǎn)進(jìn)行掃描,標(biāo)記出所有的存活對(duì)象,并將這些存活的對(duì)象復(fù)制到一塊兒新的內(nèi)存(圖中下邊的那一塊兒內(nèi)存)上去,之后將原來(lái)的那一塊兒內(nèi)存(圖中上邊的那一塊兒內(nèi)存)全部回收掉
現(xiàn)在的商業(yè)虛擬機(jī)都采用這種收集算法來(lái)回收新生代。
適用場(chǎng)合:
- 存活對(duì)象較少的情況下比較高效
- 掃描了整個(gè)空間一次(標(biāo)記存活對(duì)象并復(fù)制移動(dòng))
- 適用于年輕代(即新生代):基本上98%的對(duì)象是”朝生夕死”的,存活下來(lái)的會(huì)很少
缺點(diǎn):
- 需要一塊兒空的內(nèi)存空間
- 需要復(fù)制移動(dòng)對(duì)象
3.標(biāo)記整理
復(fù)制算法的高效性是建立在存活對(duì)象少、垃圾對(duì)象多的前提下的。
這種情況在新生代經(jīng)常發(fā)生,但是在老年代更常見(jiàn)的情況是大部分對(duì)象都是存活對(duì)象。如果依然使用復(fù)制算法,由于存活的對(duì)象較多,復(fù)制的成本也將很高。
標(biāo)記-壓縮算法是一種老年代的回收算法,它在標(biāo)記-清除算法的基礎(chǔ)上做了一些優(yōu)化。
首先也需要從根節(jié)點(diǎn)開(kāi)始對(duì)所有可達(dá)對(duì)象做一次標(biāo)記,但之后,它并不簡(jiǎn)單地清理未標(biāo)記的對(duì)象,而是將所有的存活對(duì)象壓縮到內(nèi)存的一端。之后,清理邊界外所有的空間。這種方法既避免了碎片的產(chǎn)生,又不需要兩塊相同的內(nèi)存空間,因此,其性?xún)r(jià)比比較高。
4.分代收集算法
分代收集算法就是目前虛擬機(jī)使用的回收算法,它解決了標(biāo)記整理不適用于老年代的問(wèn)題,將內(nèi)存分為各個(gè)年代。一般情況下將堆區(qū)劃分為老年代(Tenured Generation)和新生代(Young Generation),在堆區(qū)之外還有一個(gè)代就是永久代(Permanet Generation)。
在不同年代使用不同的算法,從而使用最合適的算法,新生代存活率低,可以使用復(fù)制算法。而老年代對(duì)象存活率搞,沒(méi)有額外空間對(duì)它進(jìn)行分配擔(dān)保,所以只能使用標(biāo)記清除或者標(biāo)記整理算法。
垃圾回收機(jī)制
年輕代分為Eden區(qū)和survivor區(qū)(兩塊兒:from和to),且Eden:from:to==8:1:1。
jvm內(nèi)存結(jié)構(gòu)
1)新產(chǎn)生的對(duì)象優(yōu)先分配在Eden區(qū)(除非配置了-XX:PretenureSizeThreshold,大于該值的對(duì)象會(huì)直接進(jìn)入年老代);
2)當(dāng)Eden區(qū)滿(mǎn)了或放不下了,這時(shí)候其中存活的對(duì)象會(huì)復(fù)制到from區(qū)。
這里,需要注意的是,如果存活下來(lái)的對(duì)象from區(qū)都放不下,則這些存活下來(lái)的對(duì)象全部進(jìn)入年老代。之后Eden區(qū)的內(nèi)存全部回收掉。
3)之后產(chǎn)生的對(duì)象繼續(xù)分配在Eden區(qū),當(dāng)Eden區(qū)又滿(mǎn)了或放不下了,這時(shí)候?qū)?huì)把Eden區(qū)和from區(qū)存活下來(lái)的對(duì)象復(fù)制到to區(qū)(同理,如果存活下來(lái)的對(duì)象to區(qū)都放不下,則這些存活下來(lái)的對(duì)象全部進(jìn)入年老代),之后回收掉Eden區(qū)和from區(qū)的所有內(nèi)存。
4)如上這樣,會(huì)有很多對(duì)象會(huì)被復(fù)制很多次(每復(fù)制一次,對(duì)象的年齡就+1),默認(rèn)情況下,當(dāng)對(duì)象被復(fù)制了15次(這個(gè)次數(shù)可以通過(guò):-XX:MaxTenuringThreshold來(lái)配置),就會(huì)進(jìn)入年老代了。
5)當(dāng)年老代滿(mǎn)了或者存放不下將要進(jìn)入年老代的存活對(duì)象的時(shí)候,就會(huì)發(fā)生一次Full GC(這個(gè)是我們最需要減少的,因?yàn)楹臅r(shí)很?chē)?yán)重)。
垃圾回收有兩種類(lèi)型:Minor GC 和 Full GC。
1.Minor GC
對(duì)新生代進(jìn)行回收,不會(huì)影響到年老代。因?yàn)樾律?Java 對(duì)象大多死亡頻繁,所以 Minor GC 非常頻繁,一般在這里使用速度快、效率高的算法,使垃圾回收能盡快完成。
2.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的原因包括:老年代被寫(xiě)滿(mǎn)、永久代(Perm)被寫(xiě)滿(mǎn)和System.gc()被顯式調(diào)用等。
垃圾回收算法總結(jié)
1.年輕代:復(fù)制算法
1) 所有新生成的對(duì)象首先都是放在年輕代的。年輕代的目標(biāo)就是盡可能快速的收集掉那些生命周期短的對(duì)象。
2)
新生代內(nèi)存按照8:1:1的比例分為一個(gè)eden區(qū)和兩個(gè)survivor(survivor0,survivor1)區(qū)。一個(gè)Eden區(qū),兩個(gè)
Survivor區(qū)(一般而言)。大部分對(duì)象在Eden區(qū)中生成?;厥諘r(shí)先將eden區(qū)存活對(duì)象復(fù)制到一個(gè)survivor0區(qū),然后清空eden區(qū),當(dāng)這個(gè)survivor0區(qū)也存放滿(mǎn)了時(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ì)象直接存放到老年代。若是老年代也滿(mǎn)了就會(huì)觸發(fā)一次Full GC(Major GC),也就是新生代、老年代都進(jìn)行回收。
4) 新生代發(fā)生的GC也叫做Minor GC,MinorGC發(fā)生頻率比較高(不一定等Eden區(qū)滿(mǎn)了才觸發(fā))。
2.年老代:標(biāo)記-清除或標(biāo)記-整理
1) 在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對(duì)象,就會(huì)被放到年老代中。因此,可以認(rèn)為年老代中存放的都是一些生命周期較長(zhǎng)的對(duì)象。
2) 內(nèi)存比新生代也大很多(大概比例是1:2),當(dāng)老年代內(nèi)存滿(mǎn)時(shí)觸發(fā)Major GC即Full GC,Full GC發(fā)生頻率比較低,老年代對(duì)象存活時(shí)間比較長(zhǎng),存活率標(biāo)記高。
以上這種年輕代與年老代分別采用不同回收算法的方式稱(chēng)為”分代收集算法”,這也是當(dāng)下企業(yè)使用的一種方式
3. 每一種算法都會(huì)有很多不同的垃圾回收器去實(shí)現(xiàn),在實(shí)際使用中,根據(jù)自己的業(yè)務(wù)特點(diǎn)做出選擇就好。
你可能也喜歡:
總結(jié)
以上是生活随笔為你收集整理的直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: UAS-点评侧用户行为检索系统
- 下一篇: BAT架构师进阶:大型网站架构书籍推荐