JVM垃圾收集器(四) —— G1收集器

标签: JVM
44人阅读 评论(0) 收藏 举报
分类:

前面两篇文章主要是讲了新生代和老年代的垃圾收集器,本文就来介绍一下比较特殊的垃圾收集器——G1垃圾收集器

G1是一款面向服务端应用的垃圾收集器。

一、G1的特点:

1、并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿的时间,部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让Java程序继续执行。

2、分代收集:与其他收集器一样,分代概念在G1中依然得以保留。虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但它能够采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果。

3、空间整合:与CMS的“标记—清理”算法不同,G1从整体来看是基于“标记—整理”算法实现的收集器,从局部(两个Region之间)上来看是基于“复制”算法实现的,但无论如何,这两种算法都意味着G1运作期间不会产生内存空间碎片,收集后能提供规整的可用内存。这种特性有利于程序长时间运行,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。

4、可预测的停顿:这是G1相对于CMS的另一大优势,降低停顿时间是G1和CMS共同的关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒,这几乎已经是实时Java(RTSJ)的垃圾收集器的特征了。


二、内部执行原理:

在G1之前的其他收集器进行收集的范围都是整个新生代或者老年代。而G1是面向整个堆。
它将整个Java堆划分为多个大小相等的独立区域(Region),但是G1有一种优先级的概念,就是可回收空间比较大的region会优先进行回收,这也是G1收集器能在有限的时间活得最高回收率的原因。
G1内部每一个region都有一个remember set来记录region内对象的指针,从而有计划地避免回收时对整个堆进行扫描。


三、运作步骤:前两步和CMS是一样的

  • 初始标记(Initial Marking):仅仅只是标记一下GC Roots能直接关联到的对象,并且修改TAMS(Next Top at Mark Start)的值,让下一阶段用户程序并发运行时,能在正确可用的Region中创建新对象,这阶段需要停顿线程,但耗时很短
  • 并发标记(Concurrent Marking):从GC Root开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发执行
  • 最终标记(Final Marking):为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程Remembered Set Logs里面,最终标记阶段需要把Remembered Set Logs的数据合并到Remembered Set中,这阶段需要停顿线程,但是可并行执行
  • 筛选回收(Live Data Counting and Evacuation):首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划,这个阶段可以做到与用户程序一起并发执行,但是因为只回收一部分Region,所以时间是用户可控制的,而且停顿用户线程将大幅提高收集效率。

导致两者差异的原因在于CMS采用的是标记-清除算法,而G1采用的是标记-整理算法 + Region的内存划分


四、G1收集器运行示意图:

这里写图片描述


本文的内容和图片参考自:《深入理解Java虚拟机:JVM高级特性与最佳实践》

查看评论

【JVM】G1垃圾收集器的关键技术

前言G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用,作为体验版随着JDK 6u14版本面世,在JDK 7u4版本发行时被正式推出...
  • baiye_xing
  • baiye_xing
  • 2017-06-26 18:33:49
  • 1593

JVM垃圾收集器--G1收集器

G1(Garbage-First)是一款面向服务端应用的垃圾收集器。   与其它GC收集器相比,G1具备如下特点:   1)并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(C...
  • tanga842428
  • tanga842428
  • 2016-08-24 19:05:38
  • 349

详解 JVM Garbage First(G1) 垃圾收集器

版权声明:本文为博主原创文章,转载请联系作者并注明出处。 详解 JVM Garbage First(G1) 垃圾收集器 前言 Garbage First(G1)是垃圾收集领域的最新成...
  • coderlius
  • coderlius
  • 2018-02-06 17:25:36
  • 301

深入理解JVM03--垃圾收集器

本文是基于周志明的《深入理解Java虚拟机》 从不同角度分析垃圾收集器,可以将其分为不同的类型。 1. 按线程数分,可以分为串行垃圾回收器和并行垃圾回收器。串行垃圾回收器一次只使用一个线程进行垃圾回...
  • oChangWen
  • oChangWen
  • 2016-05-14 22:56:35
  • 5163

G1垃圾收集器入门

G1垃圾收集器入门说明concurrent: 并发, 多个线程协同做同一件事情(有状态)parallel: 并行, 多个线程各做各的事情(互相间无共享状态)参考: What’s the differe...
  • renfufei
  • renfufei
  • 2014-12-12 18:04:18
  • 37761

JVM基础(6)——G1收集器及G1日志分析

系列文章规划: JVM基础(1)——内存模型 JVM基础(2)——内存管理 JVM基础(3)——编译机制 JVM基础(4)——类加载机制 JVM基础(5)——垃圾回收和调优 JVM基础(6)——G...
  • weitry
  • weitry
  • 2016-11-15 12:57:47
  • 3333

浅谈CMS垃圾收集器与G1收集器

6、CMS收集器   CMS收集器是一种以获取最短回收停顿时间为目标的收集器。基于“标记-清除”算法实现,它的运作过程如下: 1)初始标记 2)并发标记 3)重新标记 4)并发清除   初始标记、从新...
  • oLinHao007
  • oLinHao007
  • 2015-10-04 18:04:22
  • 8211

深入理解JVM之四:详解垃圾收集器

前言前面已经对垃圾收集算法有了较为详细的介绍,这里我们将对JVM中具体的垃圾回收器进行介绍,在虚拟机规范中并没有对垃圾回收器如何实现具体介绍,因此每个厂商的垃圾回收器可能会完全不同,但是我们介绍的是基...
  • u011116672
  • u011116672
  • 2016-03-27 21:39:24
  • 2903

G1 垃圾收集器入门

G1 垃圾收集器 CMS垃圾收集器
  • zhanggang807
  • zhanggang807
  • 2015-05-26 16:53:07
  • 2817

垃圾收集器Serial 、Parallel、CMS、G1

这里介绍4个垃圾收集器,如果进行了错误的选择将会大大的影响程序的性能。     时至今日,仍然有两个事情困扰着开发人员:垃圾收集(GC)和了解异性(程序猿的悲鸣),后者我确实不太了解,因为我被前者搞...
  • lijunwyf
  • lijunwyf
  • 2016-09-21 11:05:23
  • 1351
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 1万+
    积分: 615
    排名: 8万+
    博客专栏
    最新评论