zoukankan      html  css  js  c++  java
  • G1垃圾收集器深度理论讲解【纯理论】

    在上三次中对于G1官方解读之后,接下来还得回到G1的理论化知识的了解阶段。。确实G1是概念比较复杂,而且它也是未来JDK的垃圾回收的主流,所以花再多的时间在这上面也是值得的,先来回顾一下上次过过的理论在哪打止了:https://www.cnblogs.com/webor2006/p/11129572.html

    下面继续:

    G1相对于CMS的的优势:

    • G1在压缩空间方面有优势。
      对于CMS是采用标记清除算法,不带压缩功能的,所以肯定会有内存碎片的产生,而G1采用的是拷贝复制算法,所以肯定不会产生内存碎片问题,所以压缩起来空间利用率也大大提升了。
    • G1通过将内存空间分成区域(Region)的方式避免内存碎片问题。
    • Eden、Survivor、Old区不再固定,在内存使用率上来说更灵活。
      因为G1的Eden、Survivor、Old的个数是可以动态伸缩的,而不像CMS,这些区域就已经定好大小了不能被调整。
    • G1可以通过设置预期停顿时间(Pause Time)来控制垃圾收集时间,避免应用雪崩现象。
    • G1在回收内存后会马上同时做合并空闲内存的工作,而CMS默认是在STW(stop the world)的时候做。
    • G1会在Young GC中使用,而CMS只能在Old区使用。

    G1的适合场景:

    • 服务端多核CPU、JVM内存占用较大的应用。
    • 应用在运行过程中会产生大量内存碎片、需要经常压缩空间。
    • 想要更可控、可预期的GC停顿周期;防止高并发下应用的雪崩现象。

    G1 GC模式:

    • G1提供了两种GC模式,Young GC和Mixed GC,两种都是完全Stop The World的。
    • Young GC:选定所有年轻代里的Region。通过控制年轻代的Region个数,既年轻代内存大小,来控制Young GC的时间开销。
    • Mixed GC:选定所有年轻代里的Region,外加根据global concurrent marking【在之后有单独介绍】统计得出收集收益高的若干老年代Region。在用户指定的开销目标范围内尽可能选择收益高的老年代Region。
    •  Mixed GC不是Full GC,它只能回收部分老年代的Region,如果Mixed GC实在无法跟上程序分配内存的速度,导致老年代填满无法继续进行Mixed GC,就会使用serial old GC(Full GC)来收集整个GC heap。所以本质上,G1是不提供Full GC的

    global concurrent marking:

    • global concurrent marking的执行过程类似于CMS,但是不同的是,在G1 GC中,它主要是为Mixed GC提供标记服务的,并不是一次GC过程的一个必须环节。
    • global concurrent marking的执行过程分为四个步骤。
    • 初始标记(inital mark,STW):它标记了从GC Root开始直接可达的对象。
    • 并发标记(Concurrent Marking):这个阶段从GC Root开始对heap中的对象进行标记,标记线程与应用程序线程并发执行,并且收集各个Region的存活对象信息。
    • 重新标记(Remark,STW):标记那些在并发标记阶段发生变化的对象,将被回收。
    • 清理(Cleanup):清除空Region(没有存活对象的),加入到free list。
    • 第一阶段inital mark是共用了Young GC的暂停,这是因为他们可以复用root scan操作,所以可以说global concurrent marking是伴随Young GC而发生的。
    • 第四阶段Cleanup只是回收了没有存活对象的Region,所以它并不需要STW。

    G1在运行过程中的主要模式:

    • YGC(不同于CMS)
    • 并发阶段
    • 混合模式
    • Full GC(一般是G1出现问题时发生)
    • G1 YGC在Eden充满时触发,在回收之后所有之前属于Eden的区域全部变成空白,既不属于任何一个分区(Eden、Survivor、Old)。

    Mixed GC:

    • 什么时候发生Mixed GC?
    • 由一些参数控制,另外也控制着哪些老年代Region会被选入CSet(收集集合)。
    • G1HeapWastePercent:在global concurrent marking结束之后,我们可以知道old gen regions中有多少空间要被回收,在每次YGC之后和再次发生Mixed GC之前,会检查垃圾占比是否达到此参数,只有达到了,下次才会发生Mixed GC。
    • G1MixedGCLiveThresholdPercent:old generation region中的存活对象的占比,只有在此参数之下,才会被选入CSet。
    • G1MixedGCCountTarget:一次global concurrent marking之后,最多执行Mixed GC的次数。
    • G1OldCSetRegionThresholdPercent:一次Mixed GC中能被选入CSet的最多old generation region数量。

    G1 GC其他参数:

  • 相关阅读:
    配置Yaf
    计算机科学中最重要的32个算法
    mysql show status详解
    Structs 在Struts.xml中配置action时,action的name属性最好首字母大写
    MyEclipse创建ssh项目和连接数据库
    Myeclipse安装svn插件
    win7安装ubuntu双系统
    Java查看API和源码的方法
    华为oj平台的新网址
    详细解析Java中抽象类和接口的区别
  • 原文地址:https://www.cnblogs.com/webor2006/p/11146273.html
Copyright © 2011-2022 走看看