G1 GC 全稱 Garbage-First Garbage Collector

介紹

Oracle JDK 7.4或更高版本完全支持Garbage-First(G1)垃圾收集器。G1收集器是server-style的垃圾收集器,適用於具有大內存的多處理器計算機。它極有可能滿足垃圾回收(GC)暫停時間目標,同時實現高吞吐量。全堆操作(例如全局標記)與應用程序線程並行執行。這樣可以防止與堆或活動數據大小成比例的中斷。

技術說明

G1收集器通過多種技術實現了高性能和暫停時間目標。

堆被劃分爲一組大小相等的堆區域,每個堆區域都有一個連續的虛擬內存範圍。G1執行併發全局標記階段,以確定整個堆中對象的活動性。標記階段完成後,G1知道哪些區域大部分爲空。它首先收集那些能產生大量可再利用空間的區域。這就是爲什麼這種垃圾收集方法稱爲“垃圾優先”的原因。顧名思義,G1將其收集和壓縮活動集中在可能充滿可回收對象(即垃圾)的堆區域。G1使用暫停預測模型滿足用戶定義的暫停時間目標,並根據指定的暫停時間目標選擇要收集的區域數。

由G1標識爲可回收的old區域是使用清空那些可回收區域的方式回收垃圾。G1將對象從堆的一個或多個區域複製到堆上的單個區域,並在此過程中壓縮並釋放內存。清空可回收區域動作是在多處理器上併發執行的,以減少暫停時間並增加吞吐量。因此,對於每個垃圾回收,G1都在用戶定義的暫停時間內連續工作以減少碎片。這超出了先前的兩種(cms & par)gc方法的能力。CMS(併發標記掃描)垃圾回收不會進行壓縮。ParallelOld垃圾回收僅執行整個堆壓縮,這導致相當長的暫停時間。

重要的是要注意,G1不是實時收集器。它很有可能達到設定的暫停時間目標,但並非絕對確定。G1根據先前收集的數據,估算在用戶指定的目標時間內可以收集多少個區域。因此,收集器具有收集區域成本的合理準確的模型,並且收集器使用此模型來確定要收集哪些和多少個區域,同時保持在暫停時間目標之內。

G1的推薦用例

G1的首要重點是爲運行需要大堆且GC延遲有限的應用程序的用戶提供解決方案。這意味着堆大小約爲6GB或更大,並且穩定且可預測的暫停時間低於0.5秒。

如果當前具有CMS或ParallelOld垃圾收集器運行的應用程序具有以下一個或多個特徵,則將其切換到G1將非常有益。

  • 超過50%的Java堆被實時數據佔用。
  • 對象分配率或提升率差異很大。
  • 不必要的長時間垃圾收集或壓縮暫停(長於0.5到1秒)

未來

計劃將G1作爲併發標記掃描收集器(CMS)的長期替代產品。將G1與CMS進行比較,有一些不同點。使得G1成爲更好的解決方案。一個區別是G1是壓縮收集器。G1進行了充分壓縮,完全避免使用細粒度的空閒列表進行分配,而是使用區域進行內存分配。這大大簡化了收集器的部分,並且很大程度上消除了潛在的內存碎片問題。此外,G1提供的垃圾收集暫停比CMS收集器更具可預測性,並允許用戶指定所需的暫停目標。

The Garbage First Garbage Collector

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章