G1(Garbage-First)回收器是在JDK1.7中正式使用的全新垃圾回收器,G1拥有独特的垃圾回收策略,从分代上看,G1依然属于分代垃圾回收器,它会区分年代和老年代,依然有eden和survivor区,但从堆的结构上看,它并不要求整个eden区、年清代或者老年代都连续。它使用了全新的分区算法。其特点如下:

l 并行性:G1在回收期间,可以由多个GC线程同时工作,有效利用多核计算能力。

l 并发性:G1拥有与应用程序交替执行的能力,因此一般来说,不会在整个回收期间完全阻塞应用程序。

l 分代GC:与之前回收器不同,其他回收器,它们要么工作在年轻代要么工作在老年代。G1可以同时兼顾年轻代与老年代。

l 空间整理:G1在回收过程中,会进行适当的对象移动,不像CMS,只是简单的标记清除,在若干次GC后CMS必须进行一次碎片整理,G1在每次回收时都会有效的复制对象,减少空间碎片。

l 可预见性:由于分区的原因,G1可以只选取部分区域进行内存回收,这样缩小了回收范围,因此对于全局停顿也能得到更好的控制。

G1的内存划分和主要收集过程

G1的收集过程可能有4个阶段:1.新生代GC 2.并发标记周期 3.混合收集 4.如果需要,可能会进行fullGC。

1.G1新生代GC

新生代GC只处理eden和survivor区,回收后所有eden区域都应该清空,survivor区会被清空一部分数据,但是应该至少存在一个survivor区。

2. G1的并发标记周期

l 初始标记:标记从根节点直接可达的对象。这个阶段会伴随一次新生代GC,它是会产生全局停顿的。

l 根区域扫描:由于初始标记必然会产生一次新生代GC,所以在初始标记后,eden被清空,并且存活对象移入survivor区。在这个阶段将扫描由survivor区直接可达的老年代区域,并标记这些直接可达的对象,这个过程是可以和应用程序并发执行的。

l 并发标记:和CMS类似,并发标记会扫描并查找整个堆的存活对象,并做好标记。这是一个并发的过程,并且会被新生代GC打断。

l 重新标记:和CMS标记一样,重新标记会产生一次卡顿。由于并发标记过程中,应用程序依然在运行,因此标记结果可能需要修正(程序在运行eden区有可能进入新的对象),所以在此对上一次的标记结果进行补充。在这个过程中使用SATB(Snapshot At The Beginning)算法完成,即G1会在标记之初为存活对象春哥见一个快早,这个快早有助于加速重新标记速度。

l 独占清理:这个阶段会引起程序卡顿。它将计算各个区域的存活对象和GC回收比例并进行排序,识别可供混合回收的区域。还会更新记忆集(RemebereSet)。该阶段给出了需要被混合回收的区域并进行了标记。

l 并发清理:这个阶段会识别并清理完全空闲的区域,他是并发清理的,不会引起卡顿。

3.混合回收

在并发标记周期中,虽然有部分对象被回收,但是总体上这部分回收的比例是相当低的。但是在并发标记后,G1已经明确知道哪些区域含有比较多的垃圾对象,在混合回收阶段可以专门针对这些区域进行回收。这个阶段即会执行正常的年轻代Gc又会选取一些被标记的老年代区域进行回收,它同事处理了新生代和老年代。混合Gc会执行多次,知道回收了足够多的内存空间,之后会触发一次新生代GC。新生代GC后又可能触发一次并发标记周期,最后又引起混合GC的执行。

4.必要时的FullGC

和CMS类似,并发收集器由于让应用程序与GC线程交替执行,因此总是不能避免在特别繁忙的场景会出现在回收过程中内存不足的情况,当遇到这种情况时G1也会转入一个FullGC回收。此外如果在混合GC发生空间不足或者新生代GC时,survivor区和老年代无法容纳幸存对象,都会导致一次FullGC。

了解java虚拟机—G1回收器(9)的更多相关文章

  1. 了解java虚拟机—CMS回收器(8)

    CMS(Concurrent Mark Sweep)回收器 它使用的是标记清除算法,同时又是一个使用多线程并行回收的垃圾回收器. CMS主要工作步骤 CMS工作时主要步骤有初始标记.并发标记.预清理. ...

  2. 了解java虚拟机—并行回收器(7)

    并行回收器 新生代ParNew回收器 ParNew只是简单地将串行回收器多线程化,他的回收策略,算法以及参数都喝新生代串行回收器一样.由于并行回收器使用多线程进行垃圾回收,因此,在并发能力强的CPU上 ...

  3. 实战Java虚拟机之三“G1的新生代GC”

    今天开始实战Java虚拟机之三:“G1的新生代GC”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...

  4. Java虚拟机解析篇之---垃圾回收器

    上一篇说了虚拟机的内存模型,在说到堆内存的时候我们提到了,堆内存是Java内存中区域最大的一部分,而且垃圾回收器主要就是回收这部分的内容.那么这篇就来介绍一下垃圾回收器的原理以及回收的算法. Java ...

  5. java架构之路-(JVM优化与原理)JVM之G1回收器和常见参数配置

    过去的几天里,我把JVM内部的垃圾回收算法和垃圾回收器.还剩下最后一个G1回收器没有说,我们今天数一下G1回收器和常见的参数配置. G1回收器 G1 (Garbage-First)是一款面向服务器的垃 ...

  6. JVM学习(1)——通过实例总结Java虚拟机的运行机制

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms ...

  7. Java虚拟机详解----JVM常见问题总结

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. Java虚拟机内存模型及垃圾回收监控调优

    Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...

  9. 《深入Java虚拟机学习笔记》- 第9章 垃圾收集

    一.Java内存组成 组成图 堆(Heap) 运行时数据区域,所有类实例和数组的内存均从此处分配.Java虚拟机启动时创建.对象的堆内存由称为垃圾回收器的自动内存管理系统回收. 组成 组成 详解 Yo ...

随机推荐

  1. Hadoop和一般数据库的区别?

    难道一般的数据库比如PostgreSQL就不可以做集群吗?像Oracle.SQL Sever它们就没有发明这一功能吗? https://www.jianshu.com/p/525cfe07badc H ...

  2. Alpha冲刺 - (5/10)

    Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 过去两天完成了哪些任务 基于ssm框架的前后端交互测试,结合微信小程序demo 展 ...

  3. [UWP] 用 AudioGraph 来增强 UWP 的音频处理能力——AudioFrameInputNode

    上一篇心得记录中提到了 AudioGraph, 描述了一下 什么是 AudioGraph 以及其中涉及到的各种类型的 节点(Node). 这一篇就其中比较有意思的 AudioFrameInputNod ...

  4. docker:(2)通过Dockerfile构建镜像并发布web项目

    上一篇讲解了docker的基本使用 http://www.cnblogs.com/xiaochangwei/p/8204511.html 虽然通过修改获取到的镜像可以达到使用目的,但是多操作几次就会发 ...

  5. 视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频

      视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频  2018-07-11 |  标签»下载, 下载工具, 视频 又是视频下载,老生常谈的话题.阿刚同学已在乐软博客多次与大家分享推荐 ...

  6. Linux - 结合正则表达式使用grep命令

    Grep with Regular Expression grep命令基本用法 grep [-acinv] [--color=auto] [-A n] [-B n] '搜寻字符串' 文件名参数说明: ...

  7. Java language

    1.Java开发环境: java编译运行过程: 1. 编译期:.java源文件,经过编译,生成.class字节码文件 2. 运行期:JVM加载.class并运行.class - 特点:跨平台.一次编程 ...

  8. app操作的一些命令

    这里的操作都是在windows下,在android SDK安装好之后就可以连接实体手机或者模拟器操作 1.查看连接的手机或者模拟器 adb devices 结果如下: 2.查看某个app的包名和act ...

  9. List和ArrayList的区别

    List是一个接口,而ListArray是一个类. ListArray继承并实现了List. 所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造. Lis ...

  10. redis的安装使用以及在python中操作redis

    一.Redis介绍: Redis可以看作是一个key-value的存储系统,它为我们提供了丰富的数据结构,包括lists,sets,ordered sets和hashes.还包括了对这些数据结构的丰富 ...