垃圾回收器就是垃圾回收的實(shí)踐者,隨著JDK的發(fā)展,垃圾回收器也在不斷的更迭,在不同的場(chǎng)合下使用不同的垃圾回收器,這也是JVM調(diào)優(yōu)的一部分。
1.垃圾回收器的分類
-
按線程可分為單線程(串行)垃圾回收器和多線程(并行)垃圾回收器。
-
按工作模式可分為獨(dú)占式和并發(fā)式垃圾回收器。
-
按工作的區(qū)間可分為年輕代垃圾回收器和老年代垃圾回收器。
2.GC的性能指標(biāo)
GC的性能主要看:
-
吞吐量,運(yùn)行用戶代碼所占的總運(yùn)行時(shí)間比例。
-
垃圾收集開銷,垃圾收集所占總運(yùn)行時(shí)間的比例。
-
暫停時(shí)間,在垃圾回收時(shí),工作線程暫??偦ㄙM(fèi)的時(shí)間。
-
對(duì)象的存活時(shí)間,一個(gè)對(duì)象從創(chuàng)建到被回收所經(jīng)歷的時(shí)間。
3.HotSpot的垃圾回收器
3.1CMS
CMS稱Concurrent Mark Sweep,并發(fā)標(biāo)記清除,它在垃圾清除時(shí)可以使工作線程和GC線程并發(fā)執(zhí)行,所以在垃圾收集的過程中用戶的體驗(yàn)感會(huì)好很多。
CMS垃圾回收的過程:
-
初始標(biāo)記:工作線程暫停,GC標(biāo)記線程單獨(dú)工作。
-
并發(fā)標(biāo)記:工作線程和GC線程一起執(zhí)行。
-
重新標(biāo)記:工作線程暫停,GC標(biāo)記線程單獨(dú)工作。
-
并發(fā)清理:工作線程和GC線程一起執(zhí)行。
如下圖所示:
?CMS的優(yōu)點(diǎn):
-
可以做到并發(fā)收集,提升用戶的體驗(yàn)感。
CMS的缺點(diǎn):
-
CMS是基于標(biāo)記——清除算法的,會(huì)存在內(nèi)存碎片。
-
CMS在并發(fā)階段,CPU資源有限,在并發(fā)執(zhí)行下還是占用了一定的資源的,總吞吐量會(huì)變低。
-
CMS無法處理浮動(dòng)垃圾。
4.三色標(biāo)記算法
從CMS垃圾收集器開始,引入了三色標(biāo)記算法,就是將對(duì)象的顏色分為了黑、灰、白三種顏色。
黑色:表示該對(duì)象確定為存活對(duì)象。
灰色:對(duì)象已經(jīng)被掃描,但是還未掃描此對(duì)象下的引用。
白色:表示此對(duì)象不可達(dá),為垃圾對(duì)象。
三色標(biāo)記的過程:
-
初始確定GC Roots根為黑色對(duì)象。
-
將GC Roots根下關(guān)聯(lián)的對(duì)象標(biāo)記為灰色。
-
下一次掃描灰色對(duì)象,先將灰色變?yōu)楹谏?,之后將其下的引用?biāo)記為灰色。
-
一直重復(fù),直到?jīng)]有灰色對(duì)象。
-
黑色則為存活對(duì)象,白色為垃圾對(duì)象。
三色標(biāo)記可能出現(xiàn)的問題:
漏標(biāo):
?
????????因?yàn)镃MS中的工作線程和GC線程并發(fā)執(zhí)行的,此時(shí)A確定為黑色,B,C為灰色,正常情況下下次應(yīng)該掃描B了,但是假如此時(shí)A與B失去了關(guān)聯(lián)引用,我們發(fā)現(xiàn)此時(shí)B為灰色,并不能立即直接列為垃圾對(duì)象(B就為浮動(dòng)垃圾),而是需要等到下次GC掃描時(shí),才會(huì)發(fā)現(xiàn)B是垃圾對(duì)象。
錯(cuò)標(biāo):
????????這種情況是B和D開始已經(jīng)失去了關(guān)聯(lián),然后將D標(biāo)記為白色,表示垃圾對(duì)象,此時(shí)如果突然A和D建立了引用,但是D已經(jīng)標(biāo)記為白色了,之后不在會(huì)掃描了,之后D就會(huì)被當(dāng)為垃圾對(duì)象回收。
解決錯(cuò)標(biāo)問題的策略:
????????我們發(fā)現(xiàn)錯(cuò)標(biāo)遠(yuǎn)比漏標(biāo)更為嚴(yán)重,錯(cuò)標(biāo)在同時(shí)滿足下面兩種情況時(shí)才會(huì)發(fā)生:
打破這兩種情況的任意一種即可解決錯(cuò)標(biāo)問題,即利用原始快照或者增量更新。
原始快照:在斷開之時(shí),快照將此引用保存下,之后這次掃描完,在以B根重新掃描一次。
增量更新:等建立聯(lián)系之后,以A根再掃描一次。
5.G1(Garbage First)垃圾優(yōu)先回收器
G1可以在延遲可控的情況下,盡可能多的增大吞吐量,是一款面向服務(wù)端的垃圾收集器,其將堆劃分為多個(gè)小區(qū)域,對(duì)各區(qū)域內(nèi)的垃圾數(shù)量進(jìn)行實(shí)時(shí)檢測(cè),優(yōu)先收集垃圾數(shù)量最多的,運(yùn)用在內(nèi)存較大的應(yīng)用上。
6.JDK8默認(rèn)使用的垃圾回收器
年輕代使用 Parallel Scavenge GC
老年代使用 Parallel Old GC
?文章來源地址http://www.zghlxwxcb.cn/news/detail-673584.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-673584.html
?
到了這里,關(guān)于垃圾回收器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!