簡介
算法
Garbage-First(G1)垃圾收集器全面支持JDK7 Upate 4及後續版本。G1收集器是一個服務器形式(server-style)的垃圾收集器,主要用於內存大、多處理器的機器。當您想實現:與應用程序線程併發的執行全局標記,而且有高吞吐量、面向整個堆操做時,它能夠知足您高可用性及GC暫停時間的要求。 此舉可有效防止中斷(GC時的暫停時間)與堆或者實時數據大小成比例增漲。服務器
技術併發
G1收集器經過以下技術來實現高性能和低暫停時間:性能
堆被劃分紅一組相同大小的堆區域(heap regions).每一個region 都是虛擬內存中連續的範圍。 G1執行併發全局標記時肯定整個堆中存活的對象。標記完成後,G1知曉哪些region最多是空閒的。它會首先收集這些region. 這也是爲何這個垃圾回收算法被稱爲Garbage-First. 正如它所命名的那樣。G1將它的收集及壓縮集中在堆中的一塊區域操做,這塊區域極可能所有是可回收的對象。也是就說,G1 使用暫停預測模型(pause prediction model) 在知足用戶設定的暫停時間這個目標下, G1根據設定的暫停時間來選擇能夠回收的region的區域。spa
G1使用疏散(evacuation) 來回收那些被認爲是可回收的標記過的region。 G1 從堆中一個或多個region拷貝對象至堆中一個region。在這個過程當中同時壓縮和釋放內存。Evacuation 能夠多處理器並行執行。從而下降暫停時間提升吞吐量。所以,在用戶設定的暫停時間內,每一次垃圾回收,G1持續工做來減小碎片。此舉相對了前兩種方法來講有所提升。併發標記清除CMS(Concurrent Mark Sweep) 垃圾回收不進行壓縮, 並行 Old 垃圾回收僅面向整個堆進行壓縮。所以致使暫停時間比較長。線程
注意G1不是實時收集。它能夠知足所設定的暫停時間要求,但並不必定絕對肯定。根據以往垃圾回收數據來看,G1 會根據用戶指定的時間來評估有多個Region 能夠被回收。所以,收集器有一個對於收集Region來講,合理、準確的成本模型。使用這個模型能夠肯定在設定的暫停時間內,哪些region、多少個region能夠回收。設計
G1推薦用例server
G1爲用戶運行那些須要 有限的GC延遲(<=0.5秒、穩定、可預期的暫停時間)且堆內存佔用大(堆內存大小在6G 或者更大)的應用程序提供了一種解決方案。目前採用CMS或者並行Old 垃圾回收的應用程序,若是符合如下一條或者多條的可考慮採用G1垃圾回收,並從中受益。對象
1. 實時數據的Java堆佔用>=50%。內存
2. 對象分配率的速度或提高變化很是大。
3. 不但願有太長的垃圾收集及壓縮暫停時間(大於0.5到1秒)
將來
G1設計之初就計劃長期替代CMS。 比較G1和CMS,G1可謂一個比較好的解決方案。不一樣之處在於G1是一個壓縮收集器。G1契約足以徹底避免使用細粒度的空閒列來進行收集。反而使用Region.這就很大程度上簡化了收集的範圍和可能潛在的碎片問題,同時,相對CMS,G1提供可預測的GC暫停時間,容許用戶指定所須要的暫停時間。