美文网首页
GC - 垃圾收集器比较

GC - 垃圾收集器比较

作者: 面向对象架构 | 来源:发表于2022-12-20 13:30 被阅读0次

新生代收集器 + 老年代收集器

一、Serial 收集器

串行收集,STW 时间长。

新生代:复制算法
老年代:标记整理算法


JVM_GC-Serial-Operation-Diagram

二、ParNew 收集器

只负责新生代垃圾回收,采用复制算法。

相对于 Serial 收集器,GC 线程由串改并。


JVM_GC-ParNew-SerialOld-Operation-Diagram

三、Parallel Scavenge 收集器

新生代垃圾收集器,采用复制算法。

目标:达到一个可控制的吞吐量。吞吐量优先收集器。

-XX:GCTimeRatio:设置吞吐量大小。范围:0-100,垃圾收集时间占总时间的比率。
-XX:MaxGCPauseMillis:控制最大垃圾收集停顿时间。

-XX:+UseAdaptiveSizePolicy:开关参数,激活后,不需要人工指定新生代大小、Eden和Survivor区的比例、晋升老年代对象大小等细节参数,虚拟机会根据系统运行情况收集性能监控信息,动态调整这些参数以提高最合适的饿停顿时间或者最大的吞吐量。(自适应调节)

四、Parallel Old 收集器

Parallel Scavenge 收集器的老年代版本,支持多线程并发收集,采用标记-整理算法实现。


JVM_GC-Parallel-Scavenge-ParallelOld-Operation-Diagram

五、CMS 收集器

以获取最短回收停顿时间为目标的收集器,采用并发“标记-清除”算法。

整个过程分为四个步骤:

  1. 初始标记(需要STW)
  2. 并发标记
  3. 重新标记(需要STW)
  4. 并发清除
    JVM_GC-CMS-Mark-Sweep-Operation-Diagram
    CMS 必须预留一部分空间供并发收集时的程序运行,JDK 6时,当老年代使用了 92% 后,CMS 收集器就会被激活。
    如果CMS 运行期间预留的内存无法满足程序分配新对象的需要,就会出现一次“并发失败”,这时会启用后备预案:冻结用户线程的执行,临时启用 Serial Old 收集器来重新进行老年代的垃圾收集。

-XX:CMSInitiatingOccupancyFraction:设置触发 CMS 的百分比。 -XX:+UseCMSCompactAtFullCollection:开关参数,控制 CMS 收集器进行 Full GC 时进行内存碎片的合并整理。JDK 9后废弃。
-XX:CMSFullGCsBeforeCompaction:要求CMS 收集器在执行过若干次不整理空间的 Full GC 之后,下一次进入 Full GC 前会先进行碎片整理。0 表示每次都整理。

优点:并发收集、低停顿。

缺点:

  1. 对处理器资源非常敏感。
  2. 无法清除“浮动垃圾”。
  3. 内存碎片问题。

六、G1 收集器

全年代收集器。支持大内存,保证 GC 低延迟。


JVM_GC-Generational-Partition

Region 中有一类特殊的 Humongous 区域,专门用来存储大对象。G1 认为只要大小超过一个 Region 容量一般的对象即可判定为大对象。

每个 Region 的大小可以通过参数 -XX:G1HeapRegionSize 设定,取值范围为 1MB ~ 32MB,且应为 2 的N次幂。

  1. 逻辑空间连续,物流空间不一定连续。
    堆被分成多个大小的区域,映射为不连续的 eden、Survivor 和 old。
  2. 可预期的停顿时间。
  3. 无内存碎片,采用标记-整理算法。
  4. YGC 一次STW(复制),Mixed GC 四次STW(初始标记、重新标记、清理、复制)
  5. 停顿时间瓶颈在复制上,未能在转移过程中准确定位对象地址。
  6. 无法在堆中申请新的分区时,执行 STW 的单线程 Full GC。


    JVM_GC-G1-Operation-Diagram

RSet

一种 points-in 结构,在卡表基础上实现,每个 heap 分区(region)一个,用来记录别的 region 指向自己的指针,并标记这些指针在卡表哪些范围内(谁指向我)。
key:引用的 region 地址,value:引用的对象卡页集合。

存活对象用 RSet 标识,GC 时不用扫描整个堆。

YGC

选定 young generation region 的 RSet 作为根集,这些 RSet 记录了 old-young 的跨代引用,避免扫描整个 old generation。

年轻代复制存活对象到新的 Survivor。

Mixed GC

old generation 记录了 old-old 的 RSet,young-old的引用扫描全部由 young generation region 得到,也不用 扫描全部 old generation。

  1. 并行标记清除不可达 old,复制活跃的 young 和 old。
  2. 标记清除 old,复制 young 和 old。

region 回收价值

对象存活率、回收预计耗时,回收效果。

相关文章

  • JVM垃圾回收

    JVM垃圾收集器 一、垃圾收集器的分类 1.1 Serial GC 出现的最早,比较古老,最大的特点就是垃圾收集策...

  • JVM垃圾收集器

    垃圾收集器的理论依据是垃圾回收算法,这里是指堆内存的垃圾收集器。 垃圾收集器的两大指标: GC时间:GC时会暂停其...

  • GC - 垃圾收集器比较

    新生代收集器 + 老年代收集器 一、Serial 收集器 串行收集,STW 时间长。 新生代:复制算法老年代:标记...

  • GC垃圾回收机制

    GC算法 垃圾收集器 (标记-清除,复制,压缩,gc垃圾收集需要判断是否覆盖finalize方法?) 概述 垃圾收...

  • 读书笔记---gc收集器

    GC垃圾收集器整理 收集器种类有下面几种: serial / serial old 收集器 parnew收集器 ...

  • 关于垃圾回收

    Runtime.getRuntime().gc() 是告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是...

  • 2018-09-15

    GC算法垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 ...

  • Leakcanary

    Leakcanary System.gc(); //告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确...

  • JVM(八)-垃圾回收机制与垃圾收集器

    JVM垃圾回收(GC)模型 垃圾判断算法 GC算法 垃圾收集器的实现和选择 垃圾判断算法 引用计数法(Refere...

  • .Net GC

    什么是GC GC如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至...

网友评论

      本文标题:GC - 垃圾收集器比较

      本文链接:https://www.haomeiwen.com/subject/amtexdtx.html