垃圾收集算法
标记-清除
顾名思义,就是把要回收的对象标记出来并清除掉,缺点是会留下许多内存碎片
标记-复制
把内存分成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虚拟机》 周志明著