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. 【repost】H5总结

    1.新增的语义化标签: <nav>: 导航 <header>: 页眉 <footer>: 页脚 <section>:区块 <article> ...

  2. Centos yum 修改为阿里源以及常用的命令

    1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...

  3. 手动封装on,emit,off

    on 绑定 emit 触发 off 解绑 //存放事件eventList = {key:valhandle:[]} 1对多on(eventName,callback);handle:-------N多 ...

  4. 2.SlidingMenu(侧边栏效果)

    > 使用步骤库:别的程序可以用它的方法.图片. 下载的其中一个框架的例子是没有actionBar的,example_update 引入出错可能是俩个v4包冲突了,删掉工程里的一个,不要删了库里的 ...

  5. react在router中传递数据的2种方法

    概述 不传递数据叫什么单页面应用,渲染模块还需要http请求算什么单页面应用. 本文总结了react-router4中使用BrowserRouter时传递数据的两种方法,供以后开发参考,相信对其他人也 ...

  6. struts2框架学习笔记1:搭建测试

    Servlet是线程不安全的,Struts1是基于Servlet的框架 而Struts2是基于Filter的框架,解决了线程安全问题 因此Struts1和Struts2基本没有关系,只是创造者取名问题 ...

  7. RabbitMQ服务端配置详解

    RabbitMQ支持三种配置方式: 1) 读取环境变量中配置, 这包括shell中环境变量和rabbitmq-env.conf/rabbitmq-env-conf.bat文件中配置的环境变量 可配置如 ...

  8. 《机器学习实战(基于scikit-learn和TensorFlow)》中英文资源+源码 下载

     https://pan.baidu.com/s/1iTIoa4RXdK-lo_QEgLEOFw  提取码:76hf 

  9. Hive SQL基础操作

    创建表 hive 查看本地的文件#Can execute local commands within CLI, place a command in between ! and ;!cat data/ ...

  10. tf.nn.in_top_k原理探究

    import tensorflow as tf; A = [[0.8,0.6,0.3], [0.1,0.6,0.4],[0.5,0.1,0.9]] B = [0,2,1] out = tf.nn.in ...