收集器名称 | 作用区域 | 采用算法 | 单/多线程 | 优点 | 缺点 | 备注 |
Serial收集器 | 新生代 | 复制算法 | 单线程 | 简单高效,对于限定的单个cpu环境来说,没有线程交互的开销 | 垃圾收集时必须暂停所有其他工作线程,直到它收集结束,对于很多应用难以接受 | 是虚拟机运行在client模式下默认的新生代收集器 |
ParNew收集器 | 新生代 | 复制算法 | 多线程 | 除了Serial收集器外,只有它可以和CMS收集器配合工作 | 是运行在server模式下虚拟机中首选的新生代收集器 | |
Parallel Scavenge收集器 | 新生代 | 复制算法 | 并行多线程 | 可控吞吐量,可设置最大垃圾收集停顿时间和吞吐量大小,可设置GC自适应调节策略 | 主要适合在后台运算而不需要太多交互的任务 | |
Serial Old收集器 | Serial收集器的老年代版本 | 标记-整理算法 | 单线程 | 主要意义是给Client模式下的虚拟机使用 | ||
Parallel Old收集器 | Parallel Scavenge老年代版本 | 标记-整理算法 | 多线程 | 注重吞吐量和cpu资源敏感的场合 可以优先考虑Parallel Scavenge+Parallel Old收集器 | ||
CMS收集器 | 老年代 | 标记-清除算法 | 多线程 | 并发收集,低停顿 | 1.对于cpu资源敏感;cms默认开启的回收线程是:(cpu数量+3)/4,当cpu数量少于4个时,需要用一半左右的cpu资源回收垃圾,造成用户程序线程执行缓慢。 2.产生浮动垃圾,垃圾收集阶段用户线程在执行并产生浮动垃圾,需要预留内存空间给用户线程,如果空间不够会发生concurrent mode failure,启用备用方案serial old进行垃圾收集,停顿时间会增长 3.大量空间碎片产生,内存不连续无法分配大对象容易提前触发full gc | |
G1收集器 | 整个java堆 | 标记-整理算法 |