如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。
新生代收集器:
1、Serical收集器:采用复制算法,在它进行垃圾收集时,必须暂停其他所有的工作进程,直到收集结束( Stop The World )。
2、ParNew收集器:其实就是Serical收集器的多线程版本,由于只有它能与CMS收集器配合工作,成为了新生代的首选。
3、Parallel Scavenge收集器:关注点在控制CPU吞吐量,适合在后台运算而不需要太多交互的任务,它有GC自适应调节策略。
老年代收集器:
1、Serial Old收集器:Serical收集器的的老年代版本,采用标记-整理算法。
2、Parallel Old收集器:Parallel Scavenge收集器的老年代版本,主要意义是给出了组合Parallel Scavenge收集器使用的途径。
3、CMS(Concurrent Mark Sweep)收集器:从名字可以知道是“标记-清除”算法,整个过程包括四个步骤:
初始标记:需要“Stop The World”,只是标记一下GC Roots能直接关联到的对象,速度很快。
并发标记:进行GC Roots Tracing过程。
重新标记:需要“Stop The World”,为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。
并发清除:~
缺点:
对CPU资源非常敏感:虽然不会导致用户线程停顿,但会导致应用程序变慢。
无法处理浮动垃圾:CMS并发清除阶段伴随着程序运行而产生的浮动垃圾。不像其他收集器那样等到老年代几乎完全满了再进行收集,而是要预留足够空间。
“标记-清除”算法本身会大量的空间碎片产生。
4、G1收集器:
并行与并发:缩短“Stop The World”的停顿时间。
分代收集:虽然G1可以不需要其他收集器的配合就能独立管理整个GC堆,但对不同的存活对象能采用不同的方式去处理。
空间整合:不会产生内存空间碎片,不会因为无法找到连续内存空间而体检触发下一次的GC。
可预测的停顿:跟CMS一样能降低停顿时间,当G1还能建立可预测的停顿时间模型。