G1垃圾回收器介紹

原文:

http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html


介紹

G1垃圾回收器在jdk7 update4及之後版本開始全面支持。G1是服務器端的垃圾回收器,適用於多CPU、大內存的機器。他能滿足GC的延時目標同時保證高性能並能達到高吞吐量。所有的堆操作,比如全局標記( global marking),都與應用程序的線程併發執行,它能防止由堆大小、存活對象大小(live-data )比例不同而導致不同的暫停時間。

技術描述

The G1 collector achieves high performance and pause time goals through several techniques.
G1通過幾項技術達到高性能和暫停時間的目標。

堆被劃分爲一組相同大小的區域,每個都是一個連續的虛擬內存區域。G1會觸發一個併發的全局標記(global marking)階段區判斷整個堆的存活對象大小。標記階段結束G1就知道那個區域空閒最多,它首先在這些區域做垃圾回收,通常會釋放大量內存。這就是爲什麼這種回收器被稱作Garbage-First。正如他的名字,G1注重在對象可能被完全回收的堆上做收集和壓縮。G1使用一種暫停預測的模型用於滿足用戶定義的暫停目標,並基於這個暫停目標選擇回收區域的數量。

被G1標記爲可以回收的區域使用清空(evacuation)的方式回收,G1將對象從一個或多個區域中拷貝對象到一個區域,在此同時壓縮、釋放內存。這個清空操作在多CPU環境下是併發發生的,用於降低暫停時間和增加吞吐量。因此在每次垃圾回收階段,G1持續降低碎片、在用戶定義的暫停時間內工作。這個能力超過了之前的方法,CMS不做壓縮,ParallelOld 垃圾回收器只在整個堆上做壓縮(這會導致相當大的暫停時間)。

但需要注意的是G1並不是一個實時收集器,他會盡量遵守設定的暫停時間但不絕對。基於上次收集的數據,G1會估算在用戶定義的時間內能夠回收多少區域,因此收集器可以得到一個合理、準確的區域收集代價模型,G1會用這個模型決定在定義的時間內回收多少、回收哪些區域。



推薦使用G1的案例

G1最重要的目標是提供需要大內存、有限延遲的應用的一個方案,內存大小6G或者更高,穩定的、可預知的暫停時間小於0.5秒。

今天運行CMS、ParallelOld收集器的應用如果滿足下列情況,在轉移到G1時可以收益:

   50%的內存被存活對象(live-data)佔據
   對象分配頻率或晉升年老代頻率變化非常大。
   有長時間的對象收集和壓縮暫停

特點
G1被計劃用戶替換CMS。比較G1與CMS,G1是一個更好的選擇。第一個區別是G1是一個壓縮的收集器,足夠的壓縮避免了使用空閒列表(free-list)做內存分配,它依靠region,這很大程度上簡化了收集暫停,最大限度的消除了潛在的內存碎片問題。同時,G1提供一個可預知的暫停時間,比CMS做的更好,允許用戶設定暫停目標。

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