gc垃圾收集器 与gc算法_GC解释:收集器概述
gc垃圾收集器 與gc算法
當(dāng)前版本的HotSpot JVM包括三種類(lèi)型的垃圾收集器:
–串行收集器
–并行收集器
–多數(shù)同時(shí)收集者
它們都是世代的,這意味著它們利用了堆的劃分方式 。
垃圾收集器負(fù)責(zé)三個(gè)主要操作:
–查找不再使用的對(duì)象
–釋放這些對(duì)象之后的內(nèi)存
–壓縮堆
并非所有收集器都以相同的方式執(zhí)行這些操作,因此讓我們了解有關(guān)所有收集器的基本信息。 我們將在單獨(dú)的文章中介紹細(xì)節(jié)。
串行收集器
顧名思義,收集僅由一個(gè)線程執(zhí)行。 在次要和完全GC期間都必須停止世界(STW)。
該收集器對(duì)年輕一代使用標(biāo)記復(fù)制算法,而對(duì)舊一代使用標(biāo)記清除緊湊算法進(jìn)行清理。
串行GC專(zhuān)為單線程環(huán)境(通常是客戶(hù)端類(lèi)計(jì)算機(jī))和較小的堆而設(shè)計(jì)。 可以通過(guò)-XX:+UseSerialGC標(biāo)志啟用它。
并行(吞吐量)收集器
Young集合由多個(gè)線程并行化,這使Minor GC更快。 結(jié)果,該收集器導(dǎo)致較短但更頻繁的Young收集STW暫停。 從JDK 7u4開(kāi)始,默認(rèn)情況下還會(huì)由多個(gè)線程收集“舊世代”(并且還會(huì)導(dǎo)致世界停頓)。 在JDK 7u4之前,需要-XX:+UseParallelOldGC標(biāo)志來(lái)啟用舊一代的并行處理。 現(xiàn)在, -XX:+UseParallelGC和-XX:+UseParallelOldGC標(biāo)志都啟用了吞吐量收集器,并同時(shí)處理了老一代和年輕一代。
該收集器還在Young Generation中使用mark-copy算法,在Old Generation中使用mark-sweep-compact,但是復(fù)制和壓縮階段均由多個(gè)線程執(zhí)行。
要配置GC線程數(shù),可以使用-XX:ParallelGCThreads=X標(biāo)志。 默認(rèn)值設(shè)置為CPU內(nèi)核數(shù)。
什么時(shí)候使用并行GC是個(gè)好選擇? 好吧,基本上,只要吞吐量比延遲更重要。
多數(shù)同時(shí)收集者
它們被稱(chēng)為低暫停收集器-旨在最大程度地減少停頓的暫停并保持應(yīng)用程序盡可能的響應(yīng)
并發(fā)標(biāo)記和掃描(CMS)
使用并行標(biāo)記復(fù)制算法在多個(gè)線程中執(zhí)行次要GC。 然后將停止所有應(yīng)用程序線程。 老式服務(wù)器通常是同時(shí)收集的-當(dāng)后臺(tái)GC線程掃描老式服務(wù)器時(shí),應(yīng)用程序線程會(huì)暫停很短的時(shí)間。 Major GC期間使用的實(shí)際算法是并發(fā)標(biāo)記掃描。 您可能已經(jīng)注意到,“掃描”之后沒(méi)有“壓縮”。 沒(méi)錯(cuò)–并發(fā)標(biāo)記和清除是不會(huì)壓縮使用權(quán)空間的收集器,因此內(nèi)存可能會(huì)碎片化。 由于缺乏堆壓縮,當(dāng)GC無(wú)法將新對(duì)象放入內(nèi)存時(shí),JVM會(huì)回退到串行mark-sweep-compact算法以對(duì)舊版本進(jìn)行碎片整理和壓縮。 那就是性能下降到來(lái)的時(shí)候–所有應(yīng)用程序線程都停止了,只有一個(gè)線程負(fù)責(zé)清理和壓縮Tenured空間。
如前所述,CMS是低暫停收集器的一個(gè)示例。 這意味著當(dāng)延遲是主要目標(biāo)而不是吞吐量時(shí),這是一個(gè)不錯(cuò)的選擇-因?yàn)橥掏铝靠赡苡捎贑PU消耗的增加而降低(在應(yīng)用程序線程運(yùn)行時(shí)掃描堆不是免費(fèi)的)。
-XX:+UseConcMarkSweepGC啟用CMS收集器。 以前可以使用-XX:-UseParNewGC (單號(hào)“ UseParNewGC”之前減去-,因此請(qǐng)使用此標(biāo)記來(lái)禁用Parallel New(Young)GC)來(lái)配置具有單線程Young Generation集合的CMS,但已棄用在Java 8中已刪除,在Java 9中已刪除。
G1GC
垃圾優(yōu)先(G1)是一種新的低中斷垃圾收集器,旨在處理具有最小暫停的大型堆。 堆分為固定大小的幾個(gè)區(qū)域(同時(shí)仍保持堆的世代性質(zhì))。 這種設(shè)計(jì)使我們?cè)谔幚碚麄€(gè)“年輕一代”或“老一代”時(shí)擺脫了較長(zhǎng)的STW暫停。 現(xiàn)在,可以分別收集每個(gè)區(qū)域,這將導(dǎo)致更短但更頻繁的STW暫停。 G1將對(duì)象從一個(gè)區(qū)域復(fù)制到另一個(gè)區(qū)域,這意味著堆至少已部分壓縮。
G1使用mark-sweep-compact算法的增量版本。 可以通過(guò)指定-XX:+UseG1GC標(biāo)志來(lái)啟用它。
摘要
這是本文討論的收集器的簡(jiǎn)單比較:
| 序列號(hào) | 沒(méi)有 | 是 | 是 | 是 | – |
| 平行 | 是 | 是 | 是 | 是 | 通量 |
| 不育系 | 是 | 是 | 僅在掃描期間 | 沒(méi)有 | 潛伏 |
| G1 | 是 | 是 | 很短的 | 部分地 | 潛伏 |
還有一些其他垃圾收集器,但它們不是HotSpot JVM的一部分。 這些是:
- C4(Azul Zing JVM)
- 雪蘭多
- 平衡(IBM J9 JVM)
在Java 8中,服務(wù)器級(jí)計(jì)算機(jī)的默認(rèn)GC是Parallel Collector。 G1GC在Java 9中將是默認(rèn)的。默認(rèn)情況下,客戶(hù)端類(lèi)計(jì)算機(jī)運(yùn)行Serial Collector。
翻譯自: https://www.javacodegeeks.com/2017/09/gc-explained-collectors-overview.html
gc垃圾收集器 與gc算法
總結(jié)
以上是生活随笔為你收集整理的gc垃圾收集器 与gc算法_GC解释:收集器概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java message_Java Me
- 下一篇: YouTube 计划取消无广告的 Pre