您好,登錄后才能下訂單哦!
這篇文章主要介紹了JVM中G1收集器有什么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
首先看看G1收集器的內存模型
一、GI收集器雖然也是分代收集器,但是在內存結構上卻和其他的收集器大相徑庭,從這里就可以看出G1是物理上的分區,邏輯上的分代, G1不需要survivorTo做復制。
二、G1擁有Humongous區,是存放巨型對象的區域,巨型對象是當一個區被占到一半以上,也會出現一個區都裝不下,這時候就會需要連續的多個分區,尋找一個連續的內存區間是很困難的,如果內存不夠或許會造成Full GC。
首先談談CMS的缺點:
1.由于并發進行,CMS在收集與應用線程會同時會增加對堆內存的占用,也就是說,CMS必須要在老年代堆內存用盡之前完成垃圾回收,否則CMS回收失敗時,將觸發擔保機制,串行老年代收集器將會以STW(Stop-the-world)的方式進行一次GC,從而造成較大停頓時間;
而在G1中,設計原則是"首先收集盡可能多的垃圾(Garbage First)",G1會優先回收垃圾比例比較高得的區域,而不會等到內存用盡得時候,但是當G1收集器非常忙的時候,內存溢出,也會觸發擔保機制,就是使用serial old收集器進行一次Full GC。
2.標記清除算法無法整理空間碎片,老年代空間會隨著應用時長被逐步耗盡,最后將不得不通過擔保機制對堆內存進行壓縮。CMS也提供了參數-XX:CMSFullGCsBeForeCompaction(默認0,即每次都進行內存整理)來指定多少次CMS收集之后,進行一次壓縮的Full GC。
G1不會產生內存碎片,采用的是標志整理算法
再來看看G1的收集過程:
初始標記:標記從根節點直接可達的對象。這個階段會伴隨一次新生代GC,它是會產生全局停頓的,應用程序在這個階段必須停止執行。
根區域掃描:由于初始標記必然會伴隨一次新生代GC,所以在初始化標記后,eden被清空,并且存活對象被移到survivor區。在這個階段,將掃描由survivor區直接可達的老年代區域,并標記這些直接可達的對象。這個過程是可以和應用程序并發執行的。但是根區域掃描不能和新生代GC同時發生(因為根區域掃描依賴survivor區的對象,而新生代GC會修改這個區域),故如果恰巧此時需要新生代GC,GC就需要等待根區域掃描結束后才能進行,如果發生這種情況,這次新生代GC的時間就會延長。
并發標記:和CMS類似,并發標記將會掃描并查找整個堆的存活對象,并做好標記。這是一個并發過程,并且這個過程可以被一次新生代GC打斷。
重新標記:和CMS一樣,重新標記也是會使應用程序停頓,由于在并發標記過程中,應用程序依然運行,因此標記結果可能需要修正,所以在此階段對上一次標記進行補充。在G1中,這個過程使用SATB(Snapshot-At-The-Begining)算法完成,即G1會在標記之初為存活對象創建一個快照,這個快照有助于加速重新標記的速度。
獨占清理:顧名思義,這個階段會引起停頓。它將計算各個區域的存活對象和GC回收比例并進行排序,識別可供混合回收的區域。在這個階段,還會更新記憶集。該階段給出了需要被混合回收的區域并進行了標記,在混合回收階段,需要這些信息。
并發清理階段:識別并清理完全空閑的區域。它是并發的清理,不會引起停頓。
三色標記
提到并發標記,我們不得不了解并發標記的三色標記算法。它是描述追蹤式回收器的一種有用的方法,利用它可以推演回收器的正確性。
首先,我們將對象分成三種類型的:
黑色:跟對象或者該對象與它的子對象都被掃描(標記完成)。
灰色:對象本身被標記完成,但是還沒有掃描完該對象中的子對象
白色:未被掃描的對象。或者是掃描完成后,最終白色對象為不可達對象即為垃圾對象。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“JVM中G1收集器有什么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。