原文:

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做的更好,允许用户设定暂停目标。