一 七种垃圾回收器总结:
垃圾收集器
|
分类
|
作用位置
|
使用算法
|
特点
|
适用场景
|
Serial
|
串行运行
|
作用于新生代
|
复制算法
|
响应速度优先
|
适用于单CPU环境下的client模式
|
ParNew
|
并行运行
|
作用于新生代
|
复制算法
|
响应速度优先
|
多CPU环境Server模式下与CMS配合使用
|
Parallel
|
并行运行
|
作用于新生代
|
复制算法
|
吞吐量优先
|
适用于后台运算而不需要太多交互的场景
|
Serial Old
|
串行运行
|
作用于老年代
|
标记-压缩算法
|
响应速度优先
|
适用于单CPU环境下的Client模式
|
Parallel Old
|
并行运行
|
作用于老年代
|
标记-压缩算法
|
吞吐量优先
|
适用于后台运算而不需要太多交互的场景
|
CMS
|
并发运行
|
作用于老年代
|
标记-清除算法
|
响应速度优先
|
适用于互联网或B/S业务
|
G1
|
并发、并行运行
|
作用于新生代、老年代
|
标记-压缩算法、复制算法
|
响应速度优先
|
面向服务端应用
|
二 不同厂商、不同版本的虚拟机实现差距比较大。HotSpot虚拟机在JDK7/8后所有收集器及组合如下图
- 两个收集器间有连线,表明它们可以搭配使用:Serial/Serial Old、Serial/CMS、ParNew/Serial Old、ParNew/CMS、Parallel Scavenge/Serial Old、Parallel Scavenge/Parallel Old、G1;
- 其中Serial Old作为CMS出现"Concurrent Mode Failure"失败的后备预案。
- (红色虚线)由于维护和兼容性测试的成本,在JDK 8时将Serial+CMS、ParNew+Serial old这两个组合声明为Deprecated(JEP 173),并在JDK 9中
完全取消了这些组合的支持(JEP214),即:移除。
- (绿色虚线)JDK 14中:弃用ParallelScavenge和SeriaOold GC组合(JEP 366)
- (绿色虚框)JDK 14中:删除CMS垃圾回收器(JEP 363)
三 怎么选择垃圾回收器
- 优先调整堆的大小让JVM自适应完成。
- 如果内存小于100M,使用串行收集器
- 如果是单核、单机程序,并且没有停顿时间的要求,串行收集器
- 如果是多CPU、需要高吞吐量、允许停顿时间超过1秒,选择并行或者JVM自己选择
- 如果是多CPU、追求低停顿时间,需快速响应(比如延迟不能超过1秒,如互联网应用),使用并发收集器
官方推荐G1,性能高。现在互联网的项目,基本都是使用G1。