JVM(HotSpot VM)七大垃圾收集器的特点汇总
回收器名称 | 算法分类 | 作用区域 | 是否多线程 | 类型 | 特点 | 备注 |
---|---|---|---|---|---|---|
Serial | 复制算法 | 新生代 | 单线程 | 串行 | 响应速度优先 | 适合用于单CPU、内存较小的情况,算法简单,回收效率不高。Client默认垃圾回收器。 |
ParNew | 复制算法 | 新生代 | 多线程 | 并行 | 响应速度优先 | 适用于多CPU,并行垃圾回收,回收效率较高。唯一和CMS搭配使用的新生代垃圾回收器。 |
Parallel Scavenge | 复制算法 | 新生代 | 多线程 | 并行 | 吞吐量优先 | 更加关注吞吐量,适用于多CPU,并行垃圾回收,回收效率较高。 |
Serial Old | 标记-整理算法 | 老年代 | 单线程 | 串行 | 响应速度优先 | 与Serial搭配使用,也是适合于单CPU的设备,回收效率不高。 |
Parallel Old | 标记-整理算法 | 老年代 | 多线程 | 并行 | 吞吐量优先 | 与Parallel Scavenge配合使用,回收效率较高。 |
CMS | 标记-清除算法 | 老年代 | 多线程 | 并发 | 响应速度优先 | 追求最短的暂停时间。与ParNew配合使用,默认还要搭配上Serial Old作为备选方案。特点是尽量压缩暂停时间,使用场景:互联网,或者交互较多的情况,用户体验较好。缺点:1会产生碎片,2必须在老年代内存占用率低于某一阈值时进行垃圾回收,如果内存占用率超过这一阈值,会导致CMS回收器失效,从而使用备选方案的Serial Old回收器进行垃圾回收,会产生较长的"stop the world"时间,有时会达到1秒,甚至几秒。 |
G1 | 分代收集算法(复制算法、标记-清除算法、标记-整理算法的混合实现) | 新生代、老年代 | 多线程 | 并发、并行 | 响应速度优先(垃圾优先) | 在保证响应速度的情况下,尽可能的达到高的吞吐量。可以设置每次的垃圾回收时间在某一特定时间段内完成,G1垃圾回收器在回收时尽可能的在用户设置的这个时间段内完成,但不能完全保证一定在这个时间内完成。设置垃圾回收时间默认是200ms,不建议用户将该值设置的过小,如果设置过小,可能导致每次垃圾回收时都没有进行完全的回收,回收整体比例不大,那么会造成堆中会有大量的垃圾没有被回收掉,导致内存泄漏,进而会导致内存溢出。G1垃圾回收器在每次进行垃圾回收时,先对每一个region区域计算垃圾回收率,优先回收垃圾较多的region区域,官方将其命名为Garbage First, 也有垃圾优先的含义。 |