垃圾回收器有:
- 年轻代: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),停顿时间比初始标记长,但低于并发标记。
并发清除:使用标记清理算法进行垃圾清理。
缺点:
- 因为是标记清理算法,所以会产生内存碎片。
- 在并发清理过程中还会产生新的垃圾产生,但只能在下一次 GC 的时候进行清理。
- 对 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 的价值和成本进行筛选,以得到一个用户预期的回收方案,并回收。
来源:oschina
链接:https://my.oschina.net/Oaki/blog/3174129