在Java虚拟机(JVM)中,有以下几种常见的垃圾收集器:
- 「Serial收集器」:Serial收集器是最基本的垃圾收集器,它使用单线程进行垃圾收集。它采用"标记-复制"算法,将堆内存分为年轻代和老年代,通过复制存活对象来进行垃圾回收。Serial收集器适用于单线程环境和小型应用程序。
- 「Parallel收集器」:Parallel收集器是Serial收集器的多线程版本,它使用多个线程并行进行垃圾收集。它也采用"标记-复制"算法,但相比于Serial收集器,Parallel收集器能够更快地完成垃圾回收。Parallel收集器适用于多核处理器和需要高吞吐量的应用程序。
- 「CMS收集器」:CMS(Concurrent Mark Sweep)收集器是一种并发的垃圾收集器,它使用"标记-清除"算法来进行垃圾回收。CMS收集器通过并发标记和并发清除的方式,减少了垃圾收集导致的停顿时间。它适用于需要低延迟的应用程序。
- 「G1收集器」:G1(Garbage-First)收集器是一种面向大堆内存的垃圾收集器,它使用了分代收集和区域化内存布局的方式。G1收集器通过并发标记和并发清除的方式,以及优先回收垃圾最多的区域,来实现低延迟和高吞吐量的垃圾回收。它适用于大型应用程序和需要可预测停顿时间的应用程序。
- 「ZGC收集器」:ZGC收集器是一种低延迟的垃圾收集器,它的目标是在不超过10毫秒的停顿时间内,尽可能地回收大堆内存。ZGC收集器使用了一种称为"Region"的内存布局,将堆内存划分为多个大小相等的区域。它通过并发标记和并发清除的方式,以及读屏障和写屏障来跟踪对象的引用关系。ZGC收集器适用于需要快速响应和高吞吐量的应用程序。
- 「Shenandoah收集器」:Shenandoah收集器是一种并发的垃圾收集器,它的目标是在不超过10毫秒的停顿时间内,尽可能地回收大堆内存。Shenandoah收集器使用了一种称为"Remembered Set"的数据结构来跟踪对象的引用关系。它通过并发标记和并发清除的方式,以及读屏障和写屏障来保证垃圾收集器和应用程序的并发执行。Shenandoah收集器适用于需要快速响应和高并发的应用程序。