• 垃圾收集器


    Serial收集器

    串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。新生代、老年代使用串行回收;新生代复制算法、老年代标记-压缩;垃圾收集的过程中会Stop The World(服务暂停)

    参数控制:-XX:+UseSerialGC 串行收集器

    ParNew收集器

    ParNew收集器其实就是Serial收集器的多线程版本。新生代并行,老年代串行;新生代复制算法、老年代标记-压缩

    参数控制:-XX:+UseParNewGC ParNew收集器  、 -XX:ParallelGCThreads 限制线程数量参数

    Parallel收集器

    Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量。可以通过参数来打开自适应调节策略,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量;也可以通过参数控制GC的时间不大于多少毫秒或者比例;新生代复制算法、老年代标记-压缩

    参数控制:-XX:+UseParallelGC 使用Parallel收集器+ 老年代串行

    Parallel Old 收集器

    Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。这个收集器是在JDK 1.6中才开始提供

    参数控制:-XX:+UseParallelOldGC使用Parallel收集器+ 老年代并行

    CMS 收集器

    CMS 在 JDK1.7 之前可以说是最主流的垃圾回收算法。

    CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用都集中在互联网站或B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。

    从名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于“标记-清除”算法实现的,它的运作过程相对于前面几种收集器来说要更复杂一些,整个过程分为4个步骤,包括:

    初始标记(CMS initial mark)
    并发标记(CMS concurrent mark)
    重新标记(CMS remark)
    并发清除(CMS concurrent sweep)

    初始标记-短暂,仅仅只是标记一下GC Roots能直接关联到的对象,速度很快。
    并发标记-和用户的应用程序同时进行,进行GC RootsTracing的过程
    重新标记-短暂,为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。
    并发清除

    ​ 由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发地执行。

    -XX:+UseConcMarkSweepGC ,表示新生代使用ParNew,老年代的用CMS

    优点:并发收集、低停顿

    缺点:CMS收集器对CPU资源非常敏感

              无法处理浮动垃圾,可能出现“concurrent Mode Failure”失败而导致另一次Full GC的产生。

              可能会产生大量空间碎片

    参数控制:

    -XX:+UseConcMarkSweepGC 使用CMS收集器

    **-XX:+ UseCMSCompactAtFullCollection **Full GC后,进行一次碎片整理;整理过程是独占的,会引起停顿时间变长

    -XX:+CMSFullGCsBeforeCompaction 设置进行几次Full GC后,进行一次碎片整理

    -XX:ParallelCMSThreads 设定CMS的线程数量(一般情况约等于可用CPU数量)


    G1 收集器

    G1

    G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.

    G1 在 1.9 版本后成为 JVM 的默认垃圾回收算法,G1 的特点是保持高回收率的同时,减少停顿。

     G1 算法取消了堆中年轻代与老年代的物理划分,但它仍然属于分代收集器。G1 算法将堆划分为若干个区域,称作 Region

     G1垃圾收集器对于对象什么时候会转移到老年代跟之前讲过的原则一样,唯一不同的是对大对象的处理,G1有专门分配大对象的Region叫Humongous区,而不是让大对象直接进入老年代的Region中。在G1中,大对象的判定规则就是一个大对象超过了一个Region大小的50%,就会被放入Humongous中,而且一个大对象如果太大,可能会横跨多个Region来存放。Humongous区专门存放短期巨型对象,不用直接进老年代,可以节约老年代的空间,避免因为老年代空间不够的GC开销。Full GC的时候除了收集年轻代和老年代之外,也会将Humongous区一并回收。

    G1收集器一次GC的运作过程大致分为以下几个步骤:

    初始标记(initial mark,STW):暂停所有的其他线程,并记录下gc roots直接能引用的对象,速度很快 ;

    并发标记(Concurrent Marking):同CMS的并发标记

    最终标记(Remark,STW):同CMS的重新标记

    筛选回收(Cleanup,STW):筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间(可以用JVM参数 -XX:MaxGCPauseMillis指定)来制定回收计划。不管是年轻代或是老年代,回收算法主要用的是复制算法,将一个region中的存活对象复制到另一个region中,这种不会像CMS那样回收完因为有很多内存碎片还需要整理一次,G1采用复制算法回收几乎不会有太多内存碎片被视为JDK1.7以上版本Java虚拟机的一个重要进化特征。它具备以下特点:

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

    分代收集:虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。

    空间整合:与CMS的“标记--清理”算法不同,G1从整体来看是基于“标记整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。

    可预测的停顿:这是G1相对于CMS的另一个大优势,降低停顿时间是G1 和 CMS 共同的关注点,但G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段(通过参数"-

    XX:MaxGCPauseMillis"指定)内完成垃圾收集

    G1 回收过程如下。

    G1 的年轻代回收,采用复制算法,并行进行收集,收集过程会 STW。

    G1 的老年代回收时也同时会对年轻代进行回收。主要分为四个阶段:

    依然是初始标记阶段完成对根对象的标记,这个过程是STW的;

    并发标记阶段,这个阶段是和用户线程并行执行的;

    最终标记阶段,完成三色标记周期;

    复制/清除阶段,这个阶段会优先对可回收空间较大的 Region 进行回收,即 garbage first,这也是 G1 名称的由来。

    问题:把java堆分为多个Region后,垃圾收集是否就真的能以Region为单位进行?

    Region不可能是孤立的,一个对象分配再某个Region中,它并非只能被本Region中的其他对象引用,而是可以与整个java堆任意的对象发生引用关系。那在做可达性判定对象是否存活的时候,岂不是还得扫描整个java堆才能保证准确性?

    。。。。


    垃圾收集器选择

    G1 适合对最大延迟有要求的场合,ZGC 适用于 64 位系统的大内存服务中

  • 相关阅读:
    CF827D Best Edge Weight
    克鲁斯卡尔重构树总结
    模拟赛 提米树 题解 (DP+思维)
    luogu P4781 【模板】拉格朗日插值
    luogu P5826 【模板】子序列自动机
    子序列自动机
    luogu P1368 工艺 /【模板】最小表示法
    最小表示法
    SP1812 LCS2
    FZOJ 3602 T2
  • 原文地址:https://www.cnblogs.com/dingpeng9055/p/15930548.html
Copyright © 2020-2023  润新知