Jvm 老年代垃圾收集器可以分为:Serial Old 收集器、Parallel Old 收集器和 CMS(Concurrent Mark Sweep) 收集器。
Serial Old 是 Serial 收集器的老年代版本,它同样是一个单线程收集器,使用了 “标记-整理” 算法。垃圾回收一般不会直接跳到老年代回收的,一般情况下是会和新生代垃圾收集器一起使用。它一般和 Serial 收集器一起使用。
Parallel Old 是 Parallel Scavenge 收集器老年代版本,使用多线程和 “标记-整理” 算法。它也是吞吐量优先收集器。充分的利用了 CPU 的处理能力。一般情况下和 Parallel Scavenge 收集器 一起使用。
CMS 收集器是一种以获取最短回收停顿时间为目标的收集器。它是基于 “标记-清除” 算法实现的,所以会产生许多空间碎片。分为 4 个步骤:
步骤名称 | 是否并发 | 具体操作内容 |
---|---|---|
初始标记 | Stop The World | 只标记一下 GC Roots 能直接关联到的对象。 |
并发标记 | GC 线程和业务线程并发执行 | 执行 GC Roots Tracing 的过程。 |
重新标记 | Stop The World | 修正并发期间因为用户线程继续执行,导致初始标记的那部分对象的变动 |
并发清除 | GC 线程和业务线程并发执行 | 清除那些垃圾对象 |
CMS 收集器是以低停顿为目标,而 Parallel Scavenge 收集器收集器是以吞吐量为目标,两个垃圾收集器是不同的架构,所以两个不能够并用,在多 CPU 环境中,CMS 收集器一般与 ParNew 收集器一起使用的场景比较多。