分代搜集算法

當(dāng)前商業(yè)虛擬機(jī)的垃圾收集都采用“分代收集”(Generational Collection)算法,這種算法并沒有什么新的思想,只是根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊。一般是把Java堆分為新生代和老年代,這樣就可以根據(jù)各個年代的特點(diǎn)采用最適合的收集算法。在新生代中,每次垃圾收集時都發(fā)現(xiàn)有大批對象死去,只有少量存活,那就選用復(fù)制算法,只需要付出少量存活對象的復(fù)制成本就可以完成。而老年代中因?yàn)閷ο蟠婊盥矢?、沒有額外空間對他進(jìn)行分配擔(dān)保,就必須使用“標(biāo)記-清理”或者“標(biāo)記-整理”算法來進(jìn)行回收。

在Java虛擬機(jī)分代垃圾回收機(jī)制中,應(yīng)用程序可用的堆空間可以分為年輕代老年代,然后年輕代有被分為Eden區(qū),F(xiàn)rom區(qū)與To區(qū)。

當(dāng)系統(tǒng)創(chuàng)建一個對象的時候,總是在Eden區(qū)操作,當(dāng)這個區(qū)滿了,那么就會觸發(fā)一次YoungGC,也就是年輕代的垃圾回收

一般來說這時候不是所有的對象都沒用了,所以就會把還能用的對象復(fù)制到From區(qū)。

這樣整個Eden區(qū)就被清理干凈了,可以繼續(xù)創(chuàng)建新的對象,當(dāng)Eden區(qū)再次被用完,就再觸發(fā)一次YoungGC,然后呢,注意,這個時候跟剛才稍稍有點(diǎn)區(qū)別。這次觸發(fā)YoungGC后,會將Eden區(qū)與From區(qū)還在被使用的對象復(fù)制到To區(qū)

再下一次YoungGC的時候,則是將Eden區(qū)與To區(qū)中的還在被使用的對象復(fù)制到From區(qū)。

經(jīng)過若干次YoungGC后,有些對象在From與To之間來回游蕩,這時候From區(qū)與To區(qū)亮出了底線(閾值),這些家伙要是到現(xiàn)在還沒掛掉,對不起,一起滾到(復(fù)制)老年代吧。

老年代經(jīng)過這么幾次折騰,也就扛不住了(空間被用完),好,那就來次集體大掃除(Full GC),也就是全量回收,一起滾蛋吧。

全量回收呢,就好比我們剛才比作的大掃除,畢竟動做比較大,成本高,不能跟平時的小型值日(Young GC)相比,所以如果Full GC使用太頻繁的話,無疑會對系統(tǒng)性能產(chǎn)生很大的影響。

所以要合理設(shè)置年輕代與老年代的大小,盡量減少Full GC的操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容