G1是一個垃圾收集器,設計用於具備大量內存的多處理器機器。因爲它提升了性能效率,G1垃圾收集器最終將取代CMS垃圾收集器。性能
該垃圾收集器設計的主要目標之一是知足用戶設置的預期的 JVM 停頓時間。設計
G1 採用一個高級分析引擎來選擇在收集期間要處理的工做量,此選擇過程的結果是一組稱爲 GC 回收(collection set( CSet ))的區域。一旦收集器肯定了 GC 回收集 而且 GC 回收、整理工做已經開始,這個過程是without
stopping的,即 G1 收集器必須完成收集集合的全部區域中的全部活動對象以後才能中止;可是若是收集器選擇過大的 GC 回收集,此時的STW時間會過長超出目標pause time。對象
這種狀況在mixed collections時候比較明顯。這個特性啓動了一個機制,當選擇了一個比較大的collection set,Java12 中將把 GC 回收集(混合收集集合)拆分爲mandatory(必需或強制)及optional兩部分( 當完mandatory的部分,若是還有剩餘時間則會去處理optional部分)來將mixed collections從without stopping變爲abortable,以更好知足指定pause time的目標。內存
其中必需處理的部分包括 G1 垃圾收集器不能遞增處理的 GC 回收集的部分(如:年輕代),同時也能夠包含老年代以提升處理效率。it
將 GC 回收集拆分爲必需和可選部分時,垃圾收集過程優先處理必需部分。同時,須要爲可選 GC 回收集部分維護一些其餘數據,這會產生輕微的 CPU 開銷,但小於 1 %的變化,同時在 G1 回收器處理 GC 回收集期間,本機內存使用率也可能會增長,使用上述狀況只適用於包含可選 GC 回收部分的 GC 混合回收集合。io
在 G1 垃圾回收器完成收集須要必需回收的部分以後,若是還有時間的話,便開始收集可選的部分。可是粗粒度的處理,可選部分的處理粒度取決於剩餘的時間,一次只能處理可選部分的一個子集區域。在完成可選收集部分的集後,G1 垃圾回收器能夠根據剩餘時間決定是否中止收集。若是在處理完必需處理的部分後,剩餘時間不足,總時間花銷接近預期時間,G1 垃圾回收器也能夠停止可選部分的回收以達到知足預期停頓時間的目標。table