简介

      Garbage-First(G1)垃圾收集器全面支持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的区域。

G1使用疏散(evacuation) 来回收那些被认为是可回收的标记过的region。 G1 从堆中一个或多个region拷贝对象至堆中一个region。在这个过程中同时压缩和释放内存。Evacuation 可以多处理器并行执行。从而降低暂停时间提高吞吐量。因此,在用户设定的暂停时间内,每一次垃圾回收,G1持续工作来减少碎片。此举相对了前两种方法来说有所提高。并发标记清除CMS(Concurrent Mark Sweep) 垃圾回收不进行压缩, 并行 Old 垃圾回收仅面向整个堆进行压缩。因此导致暂停时间比较长。

注意G1不是实时收集。它可以满足所设定的暂停时间要求,但并不一定绝对确定。根据以往垃圾回收数据来看,G1 会根据用户指定的时间来评估有多个Region 可以被回收。因此,收集器有一个对于收集Region来说,合理、准确的成本模型。使用这个模型可以确定在设定的暂停时间内,哪些region、多少个region可以回收。

G1推荐用例

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暂停时间,允许用户指定所需要的暂停时间。

Java垃圾收集器之--Garbage-First Collector的更多相关文章

  1. [翻译]Java垃圾收集精粹(Java Garbage Collection Distilled)

    source URL: http://www.infoq.com/articles/Java_Garbage_Collection_Distilled Name: Java Garbage Colle ...

  2. 面试官,不要再问我“Java 垃圾收集器”了

    如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在面试过程中这个深度的问题涉及的比较 ...

  3. 面试官,不要再问我“Java 垃圾收集器”了(转载)

    如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在 面试过程中这个深度的问题涉及的比 ...

  4. JAVA垃圾收集机制剖析

    1.垃圾收集算法的核心思想 Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象.该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽 ...

  5. Java垃圾收集器

    概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用 ...

  6. 一篇文章彻底了解Java垃圾收集(GC)机制

    垃圾收集(Garbage Collection ,GC),是一个长久以来就被思考的问题,当考虑GC的时候,我们必须思考3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 那么在Java中,我们 ...

  7. Java 垃圾收集总结

    概述 垃圾收集(Garbage Collection,GC),它不是Java语言的伴生产物,它的历史比Java还要久远. 人们主要思考GC需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何 ...

  8. Java垃圾收集器——Serial,Parallel,CMS,G1收集器概述

    1.概述 Java应用启动的时候,除了配置Xms以及Xmx参数(Xmx:InitialHeapSize, Xms:MaxHeapSize),还需要选择合适的垃圾收集器. 截止Jdk1.8,共提供了7款 ...

  9. Java 垃圾收集技术

    前言 在计算机科学中,垃圾收回(GC: garbage collection)是内存自动管理的一种方式,它并不是同 Java 语言一起诞生的,实际上,早在 1959 年为了简化 Lisp 语言的手动内 ...

随机推荐

  1. C#如何判断我的程序已经有一个实例正在运行

    static class Program { private static Mutex mutex; /// <summary> /// 应用程序的主入口点. /// </summa ...

  2. 浅谈Redis数据库的键值设计(转)

    丰富的数据结构使得redis的设计非常的有趣.不像关系型数据库那样,DEV和DBA需要深度沟通,review每行sql语句,也不像memcached那样,不需要DBA的参与.redis的DBA需要熟悉 ...

  3. storm的数据源编程单元Spout学习整理

    Spout呢,是Topology中数据流的源头,也是Storm针对数据源的编程单元.一般数据的来源,是通过外部数据源来读取数据项(Tuple),并读取的数据项传输至作业的其他组件.编程人员一般可通过O ...

  4. BIP_开发案例02_BI Publisher中复杂案例实现代码(案例)

    2014-12-27 Created By BaoXinjian

  5. 系统yum源更新及某些软件官方源安装

    一.缘由 想在centos6.6上安装zabbix-agent,可是yum search 之后没有,又不想二进制安装,所以就找各种在线安装方法. 二.解决办法 思路: 1.尝试更新对应版本最新的yum ...

  6. centos下的一些命令

    1.查看版本 cat /etc/redhat-release 2.安装VIM yum -y install vim-enhanced 3.升级系统 yum -y update 4.把 vi 替换为 v ...

  7. Eclipse Tomcat配置/管理/调试指南

    从myeclipse转到Eclipse最不方便的之一莫过于Web项目部署了,老是在想怎么不能把myeclipse的那个移植过来,或者有没有高人能按照Myeclipse开发一个,非常遗憾. 原版的Ecl ...

  8. View的缩放操作--CGAffineTransformMakeScale:

    __weak UIImageView *weekImage = imageView; imageView.transform = CGAffineTransformMakeScale(0.1, 0.1 ...

  9. RightBarButon

    //rightBar button UIButton *rightButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 34, 34)]; ...

  10. List集合去重的一种方法 z

    需要对一个List<Model>集合去重,情况是该集合中会出现多个Name属性值相同的,但是其他属性值不同的数据. 在这种情况下,需求要只保留其中一个就好. 我觉得遍历和HashSet都不 ...