如果說收集算法是內(nèi)存回收的方法論吱雏,那么垃圾收集器就是內(nèi)存回收的具體實現(xiàn)。
1、Serial收集器
Serial收集器是最基本锋拖、發(fā)展歷史最悠久的收集器。這個收集器是一個單線程收集器祸轮,但它的“單線程”的意義并不僅僅說明它只會使用一個CPU或者一條收集線程去完成垃圾收集工作兽埃,更重要的是在它進行垃圾收集時,必須暫停其他工作線程适袜,知道它收集結(jié)束柄错。
特點:CPU利用率最高,停頓時間及用戶等待時間長痪蝇。
使用場景:小型應(yīng)用(client應(yīng)用)
2鄙陡、ParNew收集器
ParNew收集器是Serial的多線程版本。
使用場景:server應(yīng)用
3躏啰、Parallel Scavenge收集器
Parallel Scavenge收集器是一個新生代收集器趁矾,它也是使用復(fù)制算法的收集器,又是并行的多線程收集器给僵。Parallel Scavenge收集器的目標是達到一個可控制的吞吐量毫捣。所謂吞吐量就是CPU用于運行用戶代碼的時間是CPU總消耗時間的比值详拙,即吞吐量=運行用戶代碼時間 / (運行用戶代碼時間+垃圾收集時間),虛擬機總共運行了100分鐘蔓同,其中垃圾收集花掉1分鐘饶辙,那吞吐量及時99%。
特點:停頓時間短斑粱,回收效率高弃揽,對吞吐量要求高。
適用場景:大型應(yīng)用则北、大規(guī)模數(shù)據(jù)采集等矿微。
4、CMS(Concurrent Mark Sweep)收集器
CMS收集器是一種以獲取最短收回停頓時間為目標的收集器尚揣。CMS收集器是基于“標記--清除”算法實現(xiàn)的涌矢,分為四個步驟:
(1)初始標記
(2)并發(fā)標記
(3)重新標記
(4)并發(fā)清除
初始標記、重新標記這兩個步驟仍需要暫停用戶線程快骗。初始標記僅僅只是標記一下GC Roots能直接關(guān)聯(lián)到的對象娜庇,速度很快。
并發(fā)標記階段就是GC Roots Tracing(查找不可用對象)的過程方篮,而重新標記階段則是為了修正并發(fā)標記期間因用戶程序繼續(xù)運作而導(dǎo)致標記產(chǎn)生變動的那一部分對象的標記記錄名秀,這個階段的停頓時間一般會比初始標記階段稍長一些,但遠比并發(fā)標記的時間段藕溅。
由于整個過程中耗時最長的并發(fā)標記和并發(fā)清除過程收集器線程都可以與用戶線程一起工作泰偿,所以,從總體上來說蜈垮,CMS收集器的內(nèi)存回收過程是于用戶線程一起并發(fā)執(zhí)行的耗跛。
特點:并發(fā)收集、低停頓
使用場景:服務(wù)端應(yīng)用
5攒发、G1收集器
G1(Garbage-First)收集器是當(dāng)今收集器技術(shù)發(fā)展的最前沿成果之一调塌。G1是一款面向服務(wù)端應(yīng)用的垃圾收集器。
與其他GC收集器相比惠猿,G1具備如下特點:
(1)并行與并發(fā):G1能充分利用多CPU羔砾、多核環(huán)境下的硬件優(yōu)勢,使用多個CPU來縮短用戶線程停頓時間偶妖,部分其他收集器原本需要停頓Java線程執(zhí)行的GC動作姜凄,G1收集器仍然可以通過并發(fā)的方式讓Java程序繼續(xù)執(zhí)行。
(2)分代收集:與其他收集器一樣趾访,分代概念在G1中依然得以保留态秧。
(3)空間整合:與CMS的“標記--清理”算法不同,G1從整體來看是基于“標記--整理”算法實現(xiàn)的收集器扼鞋。
(4)可預(yù)測的停頓:這是G1相對于CMS的另一大優(yōu)勢申鱼,建立可預(yù)測的停頓時間模型愤诱,能讓使用者明確指定在一個長度為M毫秒的時間片段內(nèi),消耗在垃圾收集上的時間不得超過N毫秒捐友。