JVM 垃圾回收器分类总结
概览:
由于垃圾回收存在多种算法:标记-复制、标记-清除、标记-整理。组合多种垃圾回收器,形成分代收集算法。
新生代收集器:Serial、ParNew、Parallel Scavenge
老年代收集器:CMS、Serial Old、Parallel Old
整堆收集器: G1
1. Serial 垃圾回收器
串行垃圾回收器,单线程,执行垃圾回收时其他线程停止等待。
2. Parallel New 垃圾回收器
并行垃圾回收器。相较于 Serial,多线程并行进行垃圾回收。其他线程也必须停止等待。
3. Parallel Scavenge 收集器
与吞吐量关系密切,故也称为吞吐量优先收集器。
特点:属于新生代收集器也是采用复制算法的收集器,又是并行的多线程收集器(与 ParNew 收集器类似)。
4. Parallel Old 收集器
是 Parallel Scavenge 收集器的老年代版本。
特点:多线程,采用标记-整理算法。
应用场景:注重高吞吐量以及 CPU 资源敏感的场合,都可以优先考虑 Parallel Scavenge+Parallel Old 收集器。
5. Serial Old 收集器
Serial Old 是 Serial 收集器的老年代版本。
特点:同样是单线程收集器,采用标记-整理算法。
6. CMS 垃圾回收器
并发垃圾回收器,在进行垃圾回收时,其余线程不必停止等待。
CMS 收集器的运行过程分为下列 4 步:
初始标记:标记 GC Roots 能直接到的对象。速度很快但是仍存在 Stop The World 问题。
并发标记:进行 GC Roots Tracing 的过程,找出存活对象且用户线程可并发执行。
重新标记:为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。仍然存在 Stop The World 问题。
并发清除:对标记的对象进行清除回收。
CMS 收集器的内存回收过程是与用户线程一起并发执行的。
7. G1 垃圾回收器
一款面向服务端应用的垃圾收集器。它把内存划分为多个不同的子区域,G1只存在逻辑上的分区,子区域可能随G1的运行在不同代期间前后切换,每个子区域大小为1-32M
不等,最多设置2048
个区域。
特点如下:
并行与并发:G1 能充分利用多 CPU、多核环境下的硬件优势,使用多个 CPU 来缩短 Stop-The-World 停顿时间。部分收集器原本需要停顿 Java 线程来执行 GC 动作,G1 收集器仍然可以通过并发的方式让 Java 程序继续运行。
分代收集:G1 能够独自管理整个 Java 堆,并且采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次 GC 的旧对象以获取更好的收集效果。
空间整合:G1 运作期间不会产生空间碎片,收集后能提供规整的可用内存。
可预测的停顿:G1 除了追求低停顿外,还能建立可预测的停顿时间模型。能让使用者明确指定在一个长度为 M 毫秒的时间段内,消耗在垃圾收集上的时间不得超过 N 毫秒。