Java垃圾收集器之--Garbage-First Collector

简介
算法

      Garbage-FirstG1垃圾收集器全面支持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暂停时间,容许用户指定所须要的暂停时间。

相关文章
相关标签/搜索