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

你可能感兴趣的:(jvm,java,jvm,g1gc)