- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- java中的垃圾收集器是什么
本篇內容介紹了“java中的垃圾收集器是什么”的有關(guān)知識,在實(shí)際案例的操作過(guò)程中,不少人都會(huì )遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學(xué)有所成!
1.經(jīng)典垃圾收集器
1.1 Serial收集器
1.2 ParNew收集器
1.3 Parallel Scavenge 收集器
1.4 Serial Old 收集器
1.5 Parallel Old 收集器
1.6 CMS 收集器
1.7 Garbage First 收集器
2低延遲垃圾收集器
2.1 Shenandoah收集器
2.2 ZGC收集器
總結
這個(gè)收集器是一個(gè)單線(xiàn)程工作的收集器,但它的單線(xiàn)程的意義并不僅僅是說(shuō)明他只會(huì )使用一個(gè)處理器或一條收集線(xiàn)程去完成垃圾收集工作,更重要對的是強調在它進(jìn)行垃圾收集時(shí),必須暫停其他所有工作線(xiàn)程,直到它收集結束。
目前已經(jīng)老無(wú)可用,但有著(zhù)優(yōu)于其他收集器的地方:簡(jiǎn)單而高效
ParNew收集器實(shí)質(zhì)上是Serial收集器的多線(xiàn)程并行版本。因為它是除了Serial收集器之外,目前唯一可以與CMS收集器配合工作的收集器,所以在JDK7之前的遺留系統中被作為首選的新生代收集器
CMS收集器是HotSpot虛擬機中第一款真正意義上支持并發(fā)的垃圾收集器,首次實(shí)現了讓垃圾收集線(xiàn)程與用戶(hù)線(xiàn)程同時(shí)工作。但是當選用CMS作為老年代收集器時(shí),新生代收集器只能選擇使用Serial收集器或者ParNew收集器
隨著(zhù)垃圾收集器技術(shù)的不斷改進(jìn),G1收集器帶著(zhù)CMS繼承者和代替者的光環(huán)登場(chǎng)。G1收集器是一個(gè)面向全堆的收集器,不需要其他新生代收集器的配合工作
Parallel Scavenge收集器也是一款新生代收集器,同樣是基于標記-復制算法實(shí)現的收集器,也可以并行收集的多線(xiàn)程收集器。它的特點(diǎn)是它的關(guān)注點(diǎn)與其他收集器不同。CMS等收集器的關(guān)注點(diǎn)是盡可能地縮短垃圾收集時(shí)用戶(hù)線(xiàn)程的停頓時(shí)間,而Parallel Scavenge收集器的目標則是達到一個(gè)可控制的吞吐量。
$$
吞吐量=\frac{運行用戶(hù)代碼時(shí)間}{運行用戶(hù)代碼時(shí)間+運行垃圾收集時(shí)間}
$$
提供了兩個(gè)參數用于精確控制吞吐量:
-XX:MaxGCPauseMillis
參數控制最大垃圾搜集停頓時(shí)間,允許的值是一個(gè)大于0的毫秒數。收集器將盡力保證內存回收花費的時(shí)間不超過(guò)用戶(hù)的設定值。但是設定過(guò)分小的值并不能起到加快回收花費的速度的作用。
-XX:GCTimeRatio
參數直接設置吞吐量大小,允許的值是一個(gè)大于0小于100的整數。也就是垃圾收集時(shí)間占總時(shí)間的比率。相當于吞吐量的倒數。
Parallel Scavenge 收集器還有一個(gè)參數:-XX:+UseAdaptiveSizePolicy
這是一個(gè)開(kāi)關(guān)參數,當這個(gè)參數被激活以后,就不需要人工指定新生代的大小,Eden與Survivor區的比例等等。虛擬機會(huì )根據當前系統的運行情況收集性能監控信息,動(dòng)態(tài)調整這些參數。
Serial Old 是 Serial收集器的老年代版本,同樣是一個(gè)單線(xiàn)程收集器,使用標記-整理算法??赡苡袃煞N用途:1. 在JDK5以及之前的版本中與Parallel Scavenge收集器搭配使用 2. 作為CMS收集器發(fā)生失敗時(shí)的后備預案。
Parallel Old 是 Parallel Scavenge收集器的老年代版本,支持多線(xiàn)程并發(fā)收集,基于標記-整理算法實(shí)現,從JDK6版本開(kāi)始提供。在注重吞吐量或者處理器資源較為稀缺的場(chǎng)合,都可以?xún)?yōu)先考慮Parallel Scavenge加Parallel Old收集器這個(gè)組合。
CMS收集器是一種以獲取最短回收停頓時(shí)間為目標的收集器,基于標記-清除算法實(shí)現。整個(gè)運作過(guò)程分為4步:
CMS收集器存在三個(gè)缺點(diǎn):
1.CMS收集器對處理器資源非常敏感,默認啟動(dòng)的回收線(xiàn)程數為(處理器核心數量+3)/ 4。在并發(fā)階段會(huì )因為占用了一部分線(xiàn)程而導致應用程序變慢,降低總吞吐量。
為了緩解這種情況虛擬機提供了“增量式并發(fā)收集器”(Incremental Concurrent Mark Sweep/i-CMS)作用是在并發(fā)標記、清理的時(shí)候讓收集器線(xiàn)程、用戶(hù)線(xiàn)程交替運行,盡量減少垃圾收集器線(xiàn)程的獨占資源的時(shí)間,這樣整個(gè)垃圾收集的過(guò)程會(huì )更長(cháng),但是對用戶(hù)程序的影響就會(huì )顯得較少一些,直觀(guān)感受是速度變慢的時(shí)間更多了,但速度下降幅度就沒(méi)有那么明顯。效果一般從jdk7開(kāi)始被聲明為deprecated ,從JDK9發(fā)布后被完全廢棄
2.由于CMS收集器無(wú)法處理“浮動(dòng)垃圾”(Floating Garbage),有可能出現"Concurrent Mode Failure" 失敗進(jìn)而導致另一完全"Stop The World"的Full GC的產(chǎn)生。
可以適當調高參數-XX:CMSInitiatingOccu-pancyFraction的值來(lái)提高CMS的觸發(fā)百分比,降低內存回收頻率,獲得更好的性能。如果設置的太高將會(huì )很容易導致大量的并發(fā)失敗產(chǎn)生,性能反而降低
3.由于基于標記-清除算法,可能在收集結束時(shí)會(huì )有大量的空間碎片產(chǎn)生
通過(guò)調節:-XX:+UseCMSCompactAtFullCollection開(kāi)關(guān)參數,默認是開(kāi)啟的,從jdk9開(kāi)始廢棄
*** -XX:CMSFullGCsBeforeCompaction 默認值是0,表示每次進(jìn)入Full GC時(shí)都進(jìn)行碎片整理***
Garbage First 收集器,簡(jiǎn)稱(chēng) G1收集器,開(kāi)創(chuàng )了收集器面向局部收集的設計思路和基于Region的內存布局形式。是一款主要面向服務(wù)端應用的垃圾收集器??梢悦嫦蚨褍却娴娜魏尾糠謥?lái)組成回收集,衡量的標準不再是它屬于哪個(gè)分代,而是哪塊內存中存放的垃圾數量最多,回收收益最大。G1開(kāi)創(chuàng )的基于Region的堆內存布局是它能夠實(shí)現這個(gè)目標的關(guān)鍵,G1不再堅持固定大小以及固定數量的分代區域劃分,而是把連續的java堆劃分為多個(gè)大小相等的獨立區域(Region),每一個(gè)Region都可以根據需要,扮演新生代的Eden空間、Survivor空間或者老年代空間。
Region中還有一類(lèi)特殊的Humongous區域,專(zhuān)門(mén)用來(lái)存儲大對象。G1認為只要大小超過(guò)了Region容量一半的對象就可以判定為大對象。每個(gè)Region的大小可以通過(guò)參數-XX:G1HeapRegionSize設定,取值范圍為1MB~32MB。
G1收集器之所以可以建立可預測的停頓時(shí)間模型,是因為它將Region作為單次回收的最小單元,即每次收集到的內存空間都是Region大小的整數倍,這樣可以有計劃地避免在整個(gè)JAVA堆中進(jìn)行全區域的垃圾收集。更具體的思路是讓G1收集器區跟蹤各個(gè)Region里面的垃圾堆積的價(jià)值大小,價(jià)值即回收所獲得的空間大小以及回收所需要的時(shí)間的經(jīng)驗值,然后在后臺 維護一個(gè)優(yōu)先級列表,每次根據用戶(hù)設定允許的收集停頓時(shí)間(-XX:MaxGCPauseMillis)優(yōu)先處理回收價(jià)值收益最大的那些Region。
G1的記憶集在存儲結構的本質(zhì)上是一種哈希表,Key是別的Region的起始地址,Value是一個(gè)集合,里面存儲的元素是卡表的索引號。G1收集器通過(guò)原始快照(SATB)算法實(shí)現了保證其不能打破原本的對象圖結構的目的。
G1收集器運作過(guò)程大致分為四個(gè)步驟:
Shenandoah收集器是一款只有OpenJDK才會(huì )包含的。與G1收集器相比,它們兩者有著(zhù)相似的堆內存布局,在初始標記、并發(fā)標記等許多階段的處理思路上都高度一致。但是在管理內存堆方面,與G1收集器至少有三個(gè)方面的明顯的不同之處:
1.支持并發(fā)的整理算法:G1的回收階段是可以多線(xiàn)程并行的,但不能與用戶(hù)線(xiàn)程并發(fā)。Shenandoah后面會(huì )講到。
2.Shenandoah收集器默認不使用分代收集。
3.Shenandoah摒棄了在G1中耗費大量?jì)却婧陀嬎阗Y源去維護的記憶集,改名為“連接矩陣”(Connection Matrix)的全局數據結構來(lái)記錄跨Region的引用關(guān)系。降低了處理跨代指針的記憶集維護消耗,也降低了偽共享問(wèn)題發(fā)生的概率
Shenandoah收集器大致工作流程可以分為9個(gè)階段:
Brooks Points:Brooks是一個(gè)人的名字,它提出使用了轉發(fā)指針(Forwarding Pointer)的技術(shù)來(lái)實(shí)現對象移動(dòng)與用戶(hù)程序并發(fā)的一種解決方案。不需要用到內存保護陷阱,而是在原有對象布局結構的最前面統一增加一個(gè)新的引用字段,在正常不處于并發(fā)移動(dòng)的情況下,該引用指向對象自己。實(shí)際上Shenandoah收集器是通過(guò)比較并交換(Compare And Swap, CAS)操作來(lái)保證并發(fā)時(shí)對象的訪(fǎng)問(wèn)正確性的。
JDK13中Shenandoah的內存屏障模型改進(jìn)為基于引用訪(fǎng)問(wèn)屏障(Load Reference Barrier)的實(shí)現,所謂“引用訪(fǎng)問(wèn)屏障”是指內存屏障只攔截對象中數據類(lèi)型為引用類(lèi)型的讀寫(xiě)操作,而不去管原生數據類(lèi)型等其他非引用字段的讀寫(xiě)。這能省去大量對原生類(lèi)型、對象比較、對象加鎖等場(chǎng)景中設置內存屏障所帶來(lái)的消耗。
ZGC收集器是一款基于Region內存布局的,暫時(shí)不設分代的,使用了讀屏障、染色指針和內存多重映射等技術(shù)來(lái)實(shí)現可并發(fā)的標記-整理算法的,以低延遲為首要目標的一款垃圾收集器。
ZGC的Region具有動(dòng)態(tài)性-動(dòng)態(tài)創(chuàng )建和銷(xiāo)毀,以及動(dòng)態(tài)的區域容量大小。
染色指針(Colored Pointer):一種直接將少量額外的信息存儲在指針上的技術(shù)。盡管在linux下64位指針的高18位不能用來(lái)尋址,但是剩余的46位所能支持的64TB內存仍然能夠充分滿(mǎn)足需要。鑒于此,將其高4位提取出來(lái)存儲四個(gè)標記信息。通過(guò)這些標志位,虛擬機可以直接從指針中看到其引用對象的三色標記狀態(tài)、是否進(jìn)入了重分配集、是否只能通過(guò)finalize( )方法才能被訪(fǎng)問(wèn)到。也使得ZGC能夠管理的內存不可以超過(guò)4TB。使用染色指針的三大優(yōu)勢:
1.可以使得一旦某個(gè)Region的存活對象被移走之后,這個(gè)Region立即就能被釋放和重用掉,不必等待整個(gè)堆中所有指向該Region的引用都被修正后才能清理。
2.可以大幅度減少在垃圾收集過(guò)程中的內存屏障的使用數量。到目前為止,ZGC都未使用寫(xiě)屏障,只使用了讀屏障。
3.可以作為一種可擴展的存儲結構用來(lái)記錄更多與對象標記、重定位過(guò)程相關(guān)的數據,以便日后進(jìn)一步提高性能。
Linux/x86-64平臺上的ZGC使用了多重映射將多個(gè)不同的虛擬內存地址映射到同一個(gè)物理內存地址上,意味著(zhù)ZGC在虛擬內存中看到的地址空間要比實(shí)際的堆內存容量來(lái)得更大。把染色指針中的標志位看作是地址的分段符,只要將這些不同的地址段都映射到同一個(gè)物理內存空間,經(jīng)過(guò)多重映射轉換后,就可以使用染色指針正常進(jìn)行尋址了。
ZGC的運作過(guò)程(省略部分與之前介紹的G1和Shenandoah相同的小階段部分):
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站