G1 是一个 服务器风格(Server-Style)的垃圾收集器。其适用目标是具有大内存的多处理器计算机。它试图在实现高吞吐量的同时,高概率地满足 GC暂停时间 目标。整个堆操作,如 全局标记,与业务线程同时运行。这可以防止 中断的发生概率 与 堆或存活数据大小 成比例。
G1 通过几种技术实现了 高性能 和 暂停时间 目标。
堆被划分成一些大小相等的区域,每个区域都是一片连续的虚拟内存(virtual memory)空间。G1 会执行一个并发的全局标记阶段,以确定整个堆中对象的存活情况。标记阶段结束后,G1 知道哪些区域大部分是空的(即存活对象较少)。它会首先收集这些区域;这通常会产生大量的可用空间。这也是为什么这种方法会被称为 “G1(Garbage-First)”。顾名思义,G1 将其 收集与压缩 活动集中在充满可回收对象(即垃圾)的区域。G1 使用 “暂停预测模型” 来满足用户定义的暂停时间目标,并基于指定的暂停时间目标选择要收集的区域数量。
G1 将一个或多个区域中的对象复制到单个区域中。在这个过程中会进行压缩并释放内存。此转移操作在多处理器上并行执行,以降低暂停时间,并提高吞吐量。因此,每次GC,G1 都会持续工作,来减少碎片。这超出了前面两种GC的能力。CMS(Concurrent Mark Sweep)不会进行压缩。(并行GC的)并行压缩只会以 整堆 的方式压缩,导致相当长的暂停时间。
需要注意的是,G1 不是 实时收集器。它可以高概率地达到暂停时间目标,但是并不绝对。基于之前收集的数据,G1 会估算出在目标时间内可以收集多少个区域。因此,收集器对于收集区域的成本有一个相当精确的模型,并用它来确定在目标暂停时间内收