當前位置:法律諮詢服務網 - 企業資訊 - G1收集器

G1收集器

G1(搶占式優先)采集器是采集器技術發展的最先進成果之壹,已在JDK 1.7 u4版本中正式投入使用。G1是面向服務的垃圾收集器,定位於替代JDK1.5中發布的CMS收集器。

與其他捕收劑相比,G1捕收劑具有以下特點:

使用G1收集器時,Java堆的內存布局與其他收集器(新生代和老壹代)有很大不同。它將整個Java堆分成大小相等的獨立區域。雖然它仍然保留了新生代和老年期的概念,但新生代和老年期不再是物理上的孤立,而是都是壹些區域的集合。

G1之所以能夠建立壹個可預測的暫停時間模型,是因為它可以有計劃地避免Java堆整個區域的垃圾收集。G1跟蹤每個區域的垃圾累積值,在後臺維護壹個優先級列表,根據每次允許的收集時間,優先回收值最大的區域。這種利用區域劃分內存空間,回收優先級區域的方法,保證了G1采集器在有限的時間內獲得最高的采集效率。

G1“把內存分成幾部分”的想法看似簡單易懂,但其實現細節遠沒有想象中那麽簡單。把Java堆分成多個區域後,垃圾收集器真的可以分區域回收垃圾嗎?首先,地區不能孤立存在。壹個對象在壹個區域內賦值,它不僅可以被這個區域內的其他對象引用,還可以被Java堆中的任何對象引用。那麽在做可達性分析判斷對象是否有生命的時候,不是要掃描整個Java堆才能保證準確性嗎?

在G1收集器中,虛擬機使用記憶集來避免對區域中對象之間的引用以及其他收集器中新老對象之間的引用進行全堆掃描。G1中的每個區域都有相應的記憶集。當虛擬機發現程序正在寫引用類型的數據時,它會生成壹個寫屏障來暫時中斷寫操作,並檢查引用所引用的對象是否在不同的區域。如果是,則通過CardTable將相關的引用信息記錄到被引用對象所屬區域的記憶集中。回收內存時,在GC根節點的枚舉範圍內加入記憶集,可以保證整個堆不被掃描,沒有遺漏。

如果不計算維護記憶集的操作,G1采集器的操作大致可分為以下幾個步驟:

在初始標記階段,只標記可以與GC根直接關聯的對象,並修改TAMS(標記開始時的下壹個頂部)的值,以便在下壹階段並發執行用戶程序時,可以在正確可用的區域中創建新對象。這個階段需要停止線程,但是需要的時間很短。

並發標記階段是從GC根開始分析堆中對象的可達性,找出幸存的對象。這個階段需要很長時間,但是它可以與用戶線程同時執行。

最後的標記階段是糾正標記記錄中由於用戶線程在並發標記階段繼續運行而發生變化的部分。虛擬機將這段時間內的對象變化記錄在線程記憶集日誌中,最終標記需要將記憶集日誌的數據合並到記憶集中。在這個階段,用戶線程需要暫停,但是可以並發執行。

最後是篩選回收階段,先對各個區域的回收價值和成本進行排序,根據用戶想要的GC暫停時間制定回收計劃。根據Oracle泄露的信息,這個階段也可以和用戶線程並行執行,但是由於只恢復了壹部分區域,時間由用戶控制,停止用戶線程會大大提高收集效率。

  • 上一篇:企業辦稅權限找不到
  • 下一篇:企業內部審計的職能是什麽?
  • copyright 2024法律諮詢服務網