這篇文章主要講解了“Java中有幾種垃圾收集器”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java中有幾種垃圾收集器”吧!
10年積累的網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有南鄭免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。垃圾收集器就是垃圾收集算法的具體實(shí)現(xiàn)。它們分別是新生代的:Serial、ParNew、ParallelScavenge老年代的:SerialOld、ParallelOld、CMS以及適用于新生代和老年代的G1。算上jdk11的ZGC目前一共是八種垃圾收集器。
Serial是最早的垃圾收集器,這是一個(gè)單線(xiàn)程收集器,它只適用一個(gè)CPU或者是一條收集線(xiàn)去執(zhí)行回收任務(wù)。
ParNew是一個(gè)新生代的多線(xiàn)程的收集器,它相當(dāng)于是Serial的多線(xiàn)程版本。它的一些參數(shù)配置和Serial基本完全相同。只不過(guò)ParNew收集器在工作的時(shí)候,是多個(gè)線(xiàn)程工作的
ParNew適合在多個(gè)CPU場(chǎng)景下使用,而我們的線(xiàn)上服務(wù)器基本都是多核CPU,所以,使用新生代的ParNew搭配老年代的CMS收集器還是挺常見(jiàn)的,我所在的部門(mén)的系統(tǒng)線(xiàn)上就是使用的ParNew+CMS組合。與Serial相同的是,ParNew在進(jìn)行垃圾回收的時(shí)候,也會(huì)暫停所用的用戶(hù)線(xiàn)程。
ParallelScavenge也是一個(gè)新生代收集器,并且也是一個(gè)多線(xiàn)程收集器,ParallelScavenge關(guān)注的點(diǎn)是應(yīng)用的吞吐量,吞吐量=用戶(hù)代碼運(yùn)行時(shí)間/用戶(hù)運(yùn)行代碼時(shí)間+GC時(shí)間,它提供了兩個(gè)參數(shù)用來(lái)控制吞吐量,分別是控制較大垃圾收集停頓時(shí)間的-XX:MaxGCPauseMillis參數(shù)和直接設(shè)置吞吐量大小的-XX:GCTimeRatio參數(shù)。GCTimeRatio參數(shù)的值是一個(gè)大于0且小于100的整數(shù),也就是垃圾收集時(shí)間占總時(shí)間的比率,相當(dāng)于是吞吐量的倒數(shù)。高吞吐量可以高效的利用CPU時(shí)間,盡快完成計(jì)算任務(wù),因此,ParallelScavenge收集器也用于需要密集計(jì)算不需要進(jìn)行用戶(hù)交互的一些后臺(tái)。
SerivalOld收集器是垃圾收集的老年代版本,也是一個(gè)單線(xiàn)程收集器。
ParallelOld收集器是ParallelScavenge的老年代版本??梢允褂肞arallelScavenge+ParallelOld組合,在注重吞吐量和CPU資源敏感的場(chǎng)合可以?xún)?yōu)先考慮ParallellSCavenge和ParallellOld組合。
CMS(ConcurrentMarkSweep),并發(fā)標(biāo)記清除,這是一種追求低停頓時(shí)間為的收集器。互聯(lián)網(wǎng)時(shí)代,用戶(hù)體驗(yàn)為王,垃圾收集的時(shí)間越短,給用戶(hù)帶來(lái)的體驗(yàn)就越好。CMS收集器整個(gè)回收過(guò)程可以分為四個(gè)步驟:
初始標(biāo)記(CMSinintmark)
并發(fā)標(biāo)記(CMSconcurrentmark)
重新標(biāo)記(CMSremarkmark)
并發(fā)清除(CMSconcurrentsweep)
G1收集器是一款面向服務(wù)端的收集器,也就是說(shuō),它將低停頓時(shí)間作為終極目標(biāo)。G1與其他垃圾收集器的區(qū)別是它可以控制垃圾收集時(shí)間在某一個(gè)范圍之內(nèi)。與CMS垃圾收集的運(yùn)行過(guò)程類(lèi)似,它分為初始標(biāo)記,并發(fā)標(biāo)記,最終標(biāo)記,篩選回收。G1之所以能夠?qū)⑼nD時(shí)間控制在一個(gè)指定的時(shí)間內(nèi),就是因?yàn)樗梢赃x擇性的進(jìn)行回收。
G1嘗試著去滿(mǎn)足最小的停頓時(shí)間,在G1中,停頓時(shí)間是可以設(shè)置的,是可控制的,之所以可以建立可預(yù)測(cè)的停頓時(shí)間模型,是因?yàn)镚1避免了在java堆中進(jìn)行全區(qū)域的垃圾收集。傳統(tǒng)的新生代老年代的內(nèi)存模型被多個(gè)大小相等的獨(dú)立區(qū)域(Region)所取代。如下圖所示,雖然新生代和老年代的概念還保留著,但是他們不再是物理隔離的了,他們都是由Region所組成。G1在清除階段是有選擇性的,它會(huì)根據(jù)設(shè)置的停頓時(shí)間,選擇回報(bào)率較大的Region。Region可以說(shuō)是G1回收器一次回收的最小單元。即每一次回收都是回收N個(gè)Region。這個(gè)N是多少,主要受到G1回收的效率和用戶(hù)設(shè)置的軟實(shí)時(shí)目標(biāo)有關(guān)。
Z垃圾收集器(ZGC)是可伸縮的低延遲垃圾收集器。ZGC可以同時(shí)執(zhí)行所有昂貴的工作,而不會(huì)將應(yīng)用程序線(xiàn)程的執(zhí)行停止超過(guò)10ms,這使得它適合于要求低延遲和/或使用非常大的堆(數(shù)TB)的應(yīng)用程序。
目前ZGC沒(méi)有分代,每次GC都會(huì)標(biāo)記整個(gè)堆,將堆分為2M(small),32M(medium),n*2M(large)三種大小的頁(yè)面(Page)來(lái)管理,根據(jù)對(duì)象的大小來(lái)判斷在哪種頁(yè)面分配,大部分對(duì)象標(biāo)記和對(duì)象轉(zhuǎn)移都是可以和應(yīng)用線(xiàn)程并發(fā)。
感謝各位的閱讀,以上就是“Java中有幾種垃圾收集器”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java中有幾種垃圾收集器這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!