Java垃圾收集器主要有以下几种:
1、Serial 收集器。最简单的收集器,单线程,仅有一条垃圾收集线程。执行的时候要停掉所有正在执行的其他线程
2、ParNew 收集器。Serial收集器的多线程版本。除了使用多线程收集外,其他(控制参数、收集算法、回收策略等等)的都与Serial一样
3、Parallel Scavenge收集器。与Par New一样,也是一种多线程收集器,它是JDK 1.8默认的收集器。关注的是吞吐量,即CPU的高效利用
4、CMS 收集器 (Concurrent Mark Sweep)。一款并发收集器。它第一次实现了垃圾收集线程与用户线程并行工作。它以实现最短回收停顿时间为目标
整个过程分为四个步骤:
初始标记: 暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快 ;
并发标记: 同时开启 GC 和⽤户线程,⽤⼀个闭包结构去记录可达对象。但在这个阶段结 束,这个闭包结构并不能保证包含当前所有的可达对象。因为⽤户线程可能会不断的更新引 ⽤域,所以 GC 线程⽆法保证可达性分析的实时性。所以这个算法⾥会跟踪记录这些发⽣引 ⽤更新的地⽅。
重新标记: 重新标记阶段就是为了修正并发标记期间因为⽤户程序继续运⾏⽽导致标记产⽣ 变动的那⼀部分对象的标记记录,这个阶段的停顿时间⼀般会⽐初始标记阶段的时间稍⻓, 远远⽐并发标记阶段时间短
并发清除: 开启⽤户线程,同时 GC 线程开始对未标记的区域做清扫。
主要优点:并发收集、低停顿。
三个明显的缺点: 对 CPU 资源敏感; ⽆法处理浮动垃圾; 它使⽤的回收算法-“标记-清除”算法会导致收集结束时会有⼤量空间碎⽚产⽣。
5、G1 收集器。主要面向服务器的垃圾收集器,在多CPU和大内存场景下有很好的性能。以极高的概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征
G1 收集器的运作⼤致分为以下⼏个步骤: 初始标记 并发标记 最终标记 筛选回收
G1 收集器在后台维护了⼀个优先列表,每次根据允许的收集时间,优先选择回收价值最⼤的 Region(这也就是它的名字 Garbage-First 的由来)。这种使⽤ Region 划分内存空间以及有优先 级的区域回收⽅式,保证了 G1 收集器在有限时间内可以尽可能⾼的收集效率(把内存化整为 零)。