一蟋定、垃圾回收算法
1张弛、引用計(jì)數(shù)法
引用計(jì)數(shù)法的實(shí)現(xiàn)非常簡(jiǎn)單,只需要為每個(gè)對(duì)象配備一個(gè)計(jì)數(shù)器即可财破。但是存在一個(gè)嚴(yán)重的問(wèn)題就是不能解決循環(huán)應(yīng)用的問(wèn)題掰派。因此在java的垃圾回收器中,沒(méi)有使用這種算法左痢。
2靡羡、標(biāo)記清除算法
標(biāo)記清楚算法是現(xiàn)在垃圾回收算法的思想基礎(chǔ)。標(biāo)記清除算法將垃圾回收分為兩個(gè)階段:標(biāo)記和清除階段俊性。
在標(biāo)記階段略步,首先通過(guò)根節(jié)點(diǎn),標(biāo)記所有從根節(jié)點(diǎn)開(kāi)始的可達(dá)對(duì)象定页。因此未被標(biāo)記的對(duì)象就是未被引用的垃圾對(duì)象趟薄。然后在清除階段,清除未被標(biāo)記的對(duì)象典徊。標(biāo)記清楚算法可能產(chǎn)生最大的問(wèn)題就是空間碎片杭煎。
3、復(fù)制算法
與標(biāo)記清除算法相比卒落,復(fù)制算法是一種相對(duì)高效的回收方法羡铲。它的核心思想是:將原有的內(nèi)存空間分為兩塊,每次只使用其中一塊儡毕,在垃圾回收時(shí)也切,將正在使用的內(nèi)存塊中的存活對(duì)象復(fù)制到未使用的內(nèi)存塊中,之后,清除正在使用的內(nèi)存塊中的所有對(duì)象雷恃,交換兩個(gè)內(nèi)存的角色疆股,完成垃圾回收。
如果系統(tǒng)中的垃圾對(duì)象很多倒槐,復(fù)制算法需要復(fù)制的存活對(duì)象數(shù)量并不會(huì)太大旬痹。因此在真正需要垃圾回收的時(shí)刻,復(fù)制算法的效率是很高的讨越。又由于對(duì)象是再垃圾回收過(guò)程中統(tǒng)一被復(fù)制到新的內(nèi)存空間中唱凯,因此,可確被蚜。回收后的內(nèi)存空間是沒(méi)有碎片的。雖然有以上兩大優(yōu)點(diǎn)卷雕,但是復(fù)制算法的代價(jià)缺點(diǎn)是將系統(tǒng)內(nèi)存折半节猿,因此,單純的復(fù)制算法也很難讓人接受漫雕。
在java的新生代串行垃圾回收器中滨嘱,使用的復(fù)制算法思想。
在垃圾回收時(shí)浸间,Eden空間的存活對(duì)象會(huì)被復(fù)制到未使用的survivor空間中(假設(shè)是to)太雨,正在使用的survivor空間(假設(shè)是from)中的年輕對(duì)象也會(huì)被復(fù)制to空間中(大對(duì)象或者老年對(duì)象直接回進(jìn)入老年代,如果to空間已滿魁蒜,則對(duì)象也會(huì)直接進(jìn)入老年代)此時(shí)Eden空間和from空間中的剩余對(duì)象就是垃圾對(duì)象囊扳,可以直接清空,to空間則存放此次回收的存活對(duì)象兜看。
4锥咸、標(biāo)記-壓縮算法
復(fù)制算法的高效性是建立在存活對(duì)象少,垃圾對(duì)象多的前提下的细移。這種情況在年輕代經(jīng)常發(fā)生搏予,但是在老年代,更常見(jiàn)的情況大部分對(duì)象都是存活對(duì)象弧轧。如果依然使用復(fù)制算法雪侥,由于存活對(duì)象較多,復(fù)制的成本也將很高精绎。因此速缨,基于老年代垃圾回收的特性,需要使用新的算法捺典。標(biāo)記壓縮算法是一種老年代的回收算法鸟廓,它在標(biāo)記清除的算法的基礎(chǔ)上做了一些優(yōu)化,標(biāo)記壓縮算法也需要從根節(jié)點(diǎn)開(kāi)始,對(duì)所有可達(dá)對(duì)象做一次標(biāo)記引谜。但之后牍陌,并不是清理未標(biāo)記的對(duì)象,而是將所有的存活對(duì)象壓縮到內(nèi)存的一端员咽。之后毒涧,清理邊界的所有空間。這種方法即避免了碎片的產(chǎn)生贝室,又不需要兩塊相同的內(nèi)存空間契讲,因此性價(jià)比較高。
5滑频、增量算法
對(duì)大部分的垃圾回收算法而言捡偏,在垃圾回收的過(guò)程中,應(yīng)用軟件將處于一種Stop the World的狀態(tài)峡迷。在Stop the World 的狀態(tài)下银伟,應(yīng)用程序的所有線程都會(huì)被掛起,暫停一切正常的工作绘搞,等待垃圾回收完成彤避。如果垃圾回收時(shí)間很長(zhǎng),應(yīng)用程序就會(huì)掛起很久夯辖,將會(huì)嚴(yán)重影響用戶體驗(yàn)或者系統(tǒng)的穩(wěn)定性琉预。
增量算法的基本思想是,如果一次將所有的垃圾進(jìn)行處理蒿褂,需要造成系統(tǒng)的長(zhǎng)時(shí)間停頓圆米,那么久可以讓垃圾收集的線程和應(yīng)用程序線程交替執(zhí)行。每次垃圾收集只收集一小片區(qū)域贮缅,接著切換到應(yīng)用線程榨咐。可以減少系統(tǒng)的停頓時(shí)間谴供。但是块茁,因?yàn)榫€程的切換和上下文轉(zhuǎn)換的消耗,會(huì)使得垃圾回收的成本上升桂肌,造成吞吐量的下降数焊。
6、分代
以Hot Spot為例崎场,新生代用復(fù)制算法佩耳,老年代用標(biāo)記壓縮算法。
二谭跨、垃圾收集器的類型
按線程分干厚,可以分為串行垃圾回收器和并行垃圾回收器李滴。串行垃圾回收器一次只使用一個(gè)線程進(jìn)行垃圾回收;并行垃圾回收器一次將開(kāi)啟多個(gè)線程同時(shí)進(jìn)行垃圾回收蛮瞄。在并行能力較強(qiáng)的CPU上使用并行垃圾回收器可以縮短GC的停頓時(shí)間所坯。
按照工作模式分,可以分為并發(fā)式垃圾回收器和獨(dú)占式垃圾回收器挂捅。并發(fā)式垃圾回收器與應(yīng)用程序線程交替工作芹助,以盡可能的減少應(yīng)用程序的停頓時(shí)間;獨(dú)占式垃圾回收器(Stop the World)一旦運(yùn)行闲先,就停止應(yīng)用程序中的其他線程状土,直到垃圾回收過(guò)程完全結(jié)束。
按照碎片處理方式伺糠,可分為壓縮式垃圾回收和非壓縮式垃圾回收器蒙谓。壓縮式垃圾回收器會(huì)在回收完成后,對(duì)存活的對(duì)象進(jìn)行壓縮整理训桶,消除回收后的碎片彼乌;非壓縮式的垃圾回收器,不進(jìn)行這不操作渊迁。
按工作的內(nèi)存區(qū)間,又可分為新生代垃圾回收器和老年代垃圾回收器灶挟。顧名思義琉朽,新生代垃圾回收器只在新生代工作;老年代垃圾回收器則工作在老年代稚铣。