垃圾回收器(待完善)

放肆的年华 提交于 2020-02-25 23:26:18

垃圾回收器有:

  • 年轻代:Serial、ParNew、Parallel Scavenge
  • 老年代:Serial Old、Parallel Old、CMS
  • 年轻代与老年代:G1

年轻代

  • Serial 收集器

单线程的收集器,执行的时候会发生 STW(Stop the world),使用标记复制算法。

  • ParNew 收集器

Serial 收集器的多线程版本,同样会发生 STW(Stop the world),使用标记复制算法。

  • Parallel Scavenge 收集器

多线程并行的收集器,使用标记复制算法。此收集器更关注的是吞吐量(运行用户代码时间/总耗时时间),其中提供了两个参数,一个是最大垃圾收集停顿时间(-XX:MaxGCPauseMillis),另一个是吞吐量大小(-XX:GCTimeRatio)。

老年代

  • Serial Old 收集器

Serial 收集器的老年代版本。

  • Paralled Old 收集器

Serial Old 收集器的多线程版本。

  • CMS 收集器

全称:Concurrent Mark Sweep,是并发多线程的收集器,使用标记清理算法。整个过程有四个步骤:初始标记、并发标记、重新标记、并发清除。

初始标记:将 GC Roots 的下一级对象进行标记,会发生 STW(Stop the world)。

并发标记:从 GC Roots 继续向下标记,所有关联的对象,直到链路的尽头。(可达性分析)

重新标记:重新进行标记一次,因为经过前面的步骤,又有新的垃圾产生,会发生 STW(Stop the world),停顿时间比初始标记长,但低于并发标记。

并发清除:使用标记清理算法进行垃圾清理。

缺点:

  1. 因为是标记清理算法,所以会产生内存碎片。
  2. 在并发清理过程中还会产生新的垃圾产生,但只能在下一次 GC 的时候进行清理。
  3. 对 CPU 敏感。因为并发标记和并发清除的时候是和用户线程同时执行的,所以占用了一部分 CPU 资源,导致应用程序变慢。

年轻代与老年代

  • G1 收集器

全称:Garbage-First,是同时用于年轻代与老年代的收集器,使用标记整理算法。

将 heap 区划分成大小相同、内存连续(每一代不一定连续)的 region 区域。

每个区域都对应着 Eden、Survivor、Old、Humongous(用于存放超大对象) 四种角色之一。

G1 有两个新的列表:

Remenbered Sets:简称 RSets,用于记录 region 中的对象的相关引用信息(如一个 region 中的对象引用了另一个 region 中的对象),当 YGC(Mixed GC) 的时候,只扫描年轻代的 region(老年代的 region),避免扫描所有的 region。

Collection Sets:简称 CSets,用于记录待回收的 region 集合。

整个过程有四个步骤:初始标记、并发标记、最终标记、筛选回收。

初始标记:将 GC Roots 的下一级对象进行标记,会发生 STW(Stop the world)。

并发标记:从 GC Roots 继续向下标记,所有关联的对象,直到链路的尽头。(可达性分析)

最终标记:会发生 STW(Stop the world),将并发标记阶段中发生变化的对象的变化记录在线程的 Remenbered Sets Logs 中,同时与 Remenbered Sets 合并。

筛选回收:对每个 region 的价值和成本进行筛选,以得到一个用户预期的回收方案,并回收。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!