GC - 垃圾收集器比较

2022-12-20  本文已影响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 回收价值

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

上一篇 下一篇

猜你喜欢

热点阅读