本文探討G1垃圾回收器核心機制,重點解答新生代回收、并發標記過程中的Young GC以及混合回收(Mixed GC)執行次數等問題。
一、新生代回收:全面覆蓋還是局部處理?
Young GC是否回收所有新生代區域?答案是肯定的,但其目的并非簡單地清除所有區域。Young GC旨在確保新生代擁有足夠可用空間,防止內存溢出。Eden區大小并非固定,G1會根據運行歷史和系統負載動態調整,以平衡吞吐量和暫停時間,而非單純追求“軟實時性”。因此,Young GC的全面回收是為了維護新生代可用空間,而Eden區大小調整是G1性能優化的策略。
二、并發標記期間的Young GC:如何處理未標記區域?
并發標記階段可能發生Young GC。如果Eden區域A尚未完成標記,Young GC會如何處理?區域A將被正常回收。并發標記與Young GC并行執行,互不干擾。Young GC只判斷對象存活與否,不考慮標記狀態。若區域A對象不再存活,即使未標記,也會被回收。這不會影響并發標記的內存布局,因為并發標記會重新掃描存活對象并更新標記信息。
三、混合回收(Mixed GC):執行次數與CSet的動態利用
Mixed GC執行次數取決于多個因素,包括G1MixedGCCountTarget參數(默認8)和堆內存浪費百分比(G1HeapWastePercent)。G1將候選老年代區域數量除以G1MixedGCCountTarget,嘗試每個周期至少回收這么多區域。每個周期后,重新評估老年代區域存活性。如果可回收空間仍大于G1HeapWastePercent,Mixed GC將繼續執行,直至滿足退出條件(例如可回收空間低于設定閾值)。因此,Mixed GC并非一次性回收所有CSet老年代區域,而是分批次回收,以控制暫停時間。