在 Java 中,垃圾收集器(GC)用于自动管理内存,通过回收不再使用的对象来释放内存资源。不同的垃圾收集器适用于不同的应用场景,以下是一些常见的垃圾收集器:
1. Serial GC
- 概述:Serial GC 是最基本的垃圾收集器,它使用单线程进行垃圾回收。
- 工作原理:Serial GC 会在每次回收时暂停所有应用程序线程,进行垃圾回收。回收完成后,应用程序线程才会继续执行。
- 适用场景:适用于单核机器或内存较小的应用。
- JVM参数:
-XX:+UseSerialGC
2. Parallel GC(吞吐量优先)
- 概述:Parallel GC 也称为吞吐量优先垃圾收集器,使用多个线程来并行地执行垃圾回收任务,旨在提高吞吐量。
- 工作原理:在回收过程中,Parallel GC 会通过多线程同时执行标记、清理和整理操作,减少回收所需的时间,适用于大多数应用。
- 适用场景:适用于对吞吐量要求高且对停顿时间要求不高的应用。
- JVM参数:
-XX:+UseParallelGC
3. CMS(Concurrent Mark-Sweep)GC
- 概述:CMS GC 是一种以低停顿时间为目标的垃圾收集器,采用并发标记和清理的方法来减少应用程序的停顿时间。
- 工作原理:
- 初始标记:单线程标记所有GC根对象。
- 并发标记:在应用程序线程运行的同时,标记所有活动对象。
- 并发清理:在应用程序线程运行的同时,清理垃圾对象。
- 重新标记:再次标记对象,最终回收垃圾。
- 整理:清理后的堆会进行整理。
- 适用场景:适用于对停顿时间要求较低的应用,尤其是服务型应用。
- JVM参数:
-XX:+UseConcMarkSweepGC
4. G1(Garbage First)GC
- 概述:G1 是一种以低停顿时间为目标的垃圾收集器,设计上既支持高吞吐量又注重低延迟,适用于大内存应用。
- 工作原理:
- 将堆划分为多个大小相等的区域(Region)。
- 回收过程基于 停顿时间目标(Pause Time Goal),优先回收垃圾最多的区域。
- G1 结合了并行、并发和分代回收机制,可以在保证低停顿时间的同时提高回收效率。
- 适用场景:适用于大内存、高吞吐量并且对停顿时间有要求的应用。
- JVM参数:
-XX:+UseG1GC
5. ZGC(Z Garbage Collector)
- 概述:ZGC 是一种低延迟垃圾收集器,旨在提供低停顿时间,尤其适合大规模堆内存应用。
- 工作原理:
- 通过并行、并发和增量标记等机制,避免长时间停顿。
- 对象压缩和重定位都是并发进行的,垃圾回收过程几乎不影响应用的响应。
- 适用场景:适用于大内存、大数据处理、低延迟和高并发场景。
- JVM参数:
-XX:+UseZGC
6. Shenandoah GC
- 概述:Shenandoah GC 是 OpenJDK 提供的另一种低延迟垃圾收集器,主要关注减少停顿时间,适合大内存系统。
- 工作原理:
- 与 ZGC 类似,Shenandoah 通过并发执行标记和清理工作来避免长时间的停顿。
- 它通过增量式的标记和清理过程来确保 GC 过程中的停顿时间始终较短。
- 适用场景:适用于需要极低延迟的应用,特别是在大型堆和多核系统上。
- JVM参数:
-XX:+UseShenandoahGC