GC 垃圾收集器
Java 堆内存采用分代回收算法,因此 JVM 针对新生代和老年代提供了多种垃圾收集器。
1. Serial 收集器
Serial 收集器是单线程收集器,采用复制算法。
是最基本的垃圾收集器,只会使用一个 cpu 或一条线程去完成垃圾收集工作,在垃圾收集时必须停止其他工作线程知道垃圾收集结束。
2. Serial Old 收集器
是 Serial 收集器的老年代版本
3. ParNew 收集器
ParNew 垃圾收集器是 Serial 的多线程版本,也采用复制算法,其余行为和 Serial 完全一样。
-
多线程收集器
-
使用复制算法
-
收集时需要暂停其他线程
4. Prarllel Scavenge 收集器
Prarllel Scavenge 收集器是一个新生代垃圾收集器,采用复制算法,是一个多线程的垃圾收集器,它的侧重点是程序达到可控的吞吐量,高吞吐量可以最高效率的利用 cpu 资源。
-
多线程收集器
-
使用复制算法
-
注重提高系统吞吐量,提高 cpu 利用率
-
具有自适应调节策略
5. Prarllel Old 收集器
Prarllel Scavenge 收集器的老年代版本,使用多线程标记整理算法。如果系统对吞吐量要求较高,可以采用 Prarllel Scavenge 与 Prarllel Old 搭配策略。
-
多线程收集器
-
使用标记整理算法
-
注重提高系统吞吐量
6. CMS 收集器
CMS 收集器是一种老年代收集器,主要目标是获得最短垃圾回收停顿时间,以获得较高的响应比,提高用户体验。使用多线程的标记清除算法。
工作机制如下:
-
并发清除:清除 GC Roots 不可达对象,和用户线程一起工作,不需要暂停
由于耗时最长的并发标记和并发清除不需要暂停其他线程,CMS 可近似看做与用户线程并发执行。
7. G1 收集器
Garbage First 垃圾收集器是目前垃圾收集器理论最前沿的成果。
G1 避免全区域垃圾收集,把堆内存划分为大小固定的几个独立区域,并跟踪这些区域的垃圾收集进度,在后台维护一个优先级列表,每次根据允许收集时间来优先回收垃圾最多的区域。
相较于 CMS,G1 有如下优势:
-
基于标记整理算法,不产生内存碎片
-
可精确控制停顿时间,在不牺牲吞吐量的前提下实现低停顿回收
8. 总结
收集器 | 运行模式 | 工作范围 | 算法 | 目标 | 适用场景 |
---|---|---|---|---|---|
Serial | 串行 | 新生代 | 复制算法 | 响应速度优先 | 单cpu环境下的Client模式 |
Serial Old | 串行 | 老年代 | 标记整理 | 响应速度优先 | 单cpu环境下的Client模式、CMS的后备预案 |
ParNew | 并行 | 新生代 | 复制算法 | 响应速度优先 | 多cpu环境时在Server模式下与CMS配合 |
Parallel Scavenge | 并行 | 新生代 | 复制算法 | 吞吐量优先 | 在后台运算而不需要太多交互的任务 |
Parallel Old | 并行 | 老年代 | 标记整理 | 吞吐量优先 | 在后台运算而不需要太多交互的任务 |
CMS | 并发 | 老年代 | 标记清除 | 响应速度优先 | 集中在互联网站或B/S系统服务端上的Java应用 |
G1 | 并发 | Both | 复制+标记整理 | 响应速度优先 | 面向服务端应用,将来替换CMS |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。