垃圾收集算法
标记-清除
顾名思义,就是把要回收的对象标记出来并清除掉,缺点是会留下许多内存碎片
标记-复制
把内存分成A、B两个相等片区,在A标记出要回收的对象,未被标记的(存活的对象)复制到B,回收整片区A。优点:以空间换时间。缺点是空间使用率不高
标记-整理
标记出要回收的对象,复制存活的对象,使用对象从头到尾排列,然后回收尾部之后的内存区域。
垃圾收集器
收集器 | 算法 | 收集线程 | 停顿情况 | 所在堆区间 | 特点 |
Serial | 标记-复制 | 单线程 | 全过程停 | 新生代 | Jvm最基本、发展历史最悠久的收集器。 |
ParNew | 标记-复制 | 多线程 | 全过程停 | 新生代 | Serira的多线程版本 |
Parallel Scavenge | 标记-复制 | 多线程 | 全过程停 | 新生代 | 能使用应用达到一个可控的吞吐量 |
Serial Old | 标记-整理 | 单线程 | 全过程停 | 老年代 | Serial的老年代版本 |
Parallel Old | 标记-整理 | 多线程 | 全过程停 | 老年代 | Parallel Scavenge的老年代版本 |
CMS | 标记-清除 | 步骤(3)可多线程, 其它单线程 | 只在(1)(3)停顿, 其它可以与用户线程并行 | 老年代 | 以最短停顿时间为目标。目前服务端上使用最多的收集器。回收过程有4个步骤: (1) 初始标记 (2) 并发标记 (3) 重新标记 (4) 并发清除 |
G1 | 标记-整理 标记-复制 | (3)(4)多线程, 其它单线程 | (1)(3)(4)停顿 | 无具体的新/老年代划分。 G1把Java堆分为多个大小相等的Region | 是众收集器较前沿的;更高效的空间整合;可预测停顿时间。运作时可以为4个步骤: (1) 初始标记 (2) 并发标记 (3) 最终标记 (4) 筛选回收 |
收集器组合图(直线代表可以互相搭配使用):
参考:《深入理解Java虚拟机》 周志明著