JVM系列之垃圾回收器(一)

经典垃圾收集器

按代分
新生代:Serial,ParNew,Parallel Scavenge
老年代: Serial Old,CMS,Parallel Old
不分代:G1,ZGC

按并行/并发分
并行收集器:Serial, Serial Old ,ParNew ,Parallel Scavenge, Parallel Old
并发收集器:CMS, G1, ZGC

并行(Parallel):描述的是多条垃圾收集器线程之间的关系,说明同⼀时间有多条这样的线程在协同⼯作,通常默认此时⽤户线程是处于等待状态。
并发(Concurrent): 描述的是垃圾收集器线程与用户线程之间的关系,说明同⼀时间垃圾收集器线程与用户线程都在运行。由于用户线程并未被冻结,所以程序仍然能响应服务请求,但由于垃圾收集器线程占⽤了⼀部分系统资源,此时应⽤程序的处理的吞吐量将受到⼀定影响。

不同收集器之间的连线表示它们可以搭配使用,如下图
在这里插入图片描述

Serial收集器

在这里插入图片描述
特点:新生代垃圾收集器;最早出现,最基础的收集器,单线程处理(包含单线程收集+stop the world)
算法:标记-复制
使用范围:新生代
优点:简单而⾼效,对于内存资源受限的环境,它是所有收集器中额外内存消耗最小的。
缺点:新生代空间大或频繁Minor GC时,停顿时间(STW)长。
应⽤:Client模式下的默认新⽣代收集器
参数:-XX:+UseSerialGC

ParNew 收集器

在这里插入图片描述
特点:新生代垃圾收集器;Serial 收集器的多线程版本,其他与Serial收集器相比并没有太多创新之处,ParNew收集器是激活CMS后(使用-XX:+UseConcMarkSweepGC选项)的默认新⽣代收集器。
算法:标记-复制
使用范围:新生代
优点:多CPU时,比Serial效率高
缺点:单核或伪双核(超线程技术)下性能比Serial差(存在线程本身的开销)
应⽤:运行在Server模式下的虚拟机中⾸选的新⽣代收集器
参数:
激活ParNew收集器: -XX:+UseParNewGC

Parallel Scavenge 收集器

在这里插入图片描述
吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)
特点:新生代垃圾收集器;多线程并行收集;与ParNew不同之处:1. 注重吞吐量;2.支持自适应调节策略
算法:标记-复制
使⽤范围:新生代
优点: 吞吐量高,适合后台运算而不需要太多交互的分析任务
缺点: 停顿时间长,不适合用户交互,要求快速响应的系统
参数:
-XX:MaxGCPauseMillis 精确控制吞吐量——控制最大垃圾收集停顿时间
-XX: GCTimeRatio 精确控制吞吐量——设置吞吐量大小
-XX:+UseAdaptiveSizePolicy 使用自适应调节

Serial Old 收集器

Serial Old 收集器运行示意图:同Serial

特点:老年代收集器;单线程收集器;主要意义同Serial一样,也是供客户端模式下的HotSpot虚拟机使用
算法:标记-整理
优点: 简单方便
缺点: 效率低
参数:
-XX:+UseSerialGC 虚拟机运行在Client 模式下的默认值,打开此开关后,使用Serial +Serial Old 的收集器组合进行内存回收
-XX:+UseParNewGC 打开此开关后,使用ParNew + Serial Old 的收集器组合进行内存回收
-XX:+UseParallelGC 虚拟机运行在Server 模式下的默认值,打开此开关后,使用ParallelScavenge + Serial Old的收集器组合进行内存回收

Parallel Old 收集器

Parallel Old 收集器运行示意图:同Parallel Scavenge
特点:Parallel Old是Parallel Scavenge收集器的老年代版本;吞吐量优先;JDK 6开始提供
算法:标记-整理

这个收集器是直到JDK 6时才开始提供的,在此之前,新生代的Parallel Scavenge收集器⼀直处于相当尴尬的状态,原因是如果新生代选择了Parallel Scavenge收集器,老年代除了Serial Old收集器以外别无选择,其他表现良好的老年代收集器,如CMS无法与它配合工作。由于老年代Serial Old收集器在服务端应用性能上的“拖累”,使用Parallel Scavenge收集器也未必能在整体上获得吞吐量最⼤化的效果。Parallel Old收集器出现后,“吞吐量优先”收集器终于有了比较名副其实的搭配组合,在注重吞吐量或者处理器资源较为稀缺的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器这个组合。

CMS 收集器

在这里插入图片描述
注:初始标记、重新标记这两个步骤仍然需要“Stop The World”。

初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快;
并发标记阶段就是从GC Roots开始对堆中对象进行可达性分析的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行;
重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远并并发标记阶段的时间短;
最后是并发清除阶段,清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。
由于在整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上来说,CMS收集器的内存回收过程是与用户线程⼀起并发执行。

特点:是HotSpot虚拟机中第一款真正意义上支持并发的垃圾收集器,首次实现了让垃圾收集线程与用户线程(基本上)同时工作;是一种以获取最短回收停顿时间为目标的收集器 ;适合B/S架构,用户交互场景。
优点:并发收集,低停顿;
缺点:
1、内存碎片(原因是采用了标记-清除算法)
2、对 CPU 资源敏感(原因是并发时和用户线程一起抢占 CPU)
3、浮动垃圾:在并发标记阶段产生了新垃圾不会被及时回收,而是只能等到下一次GC
参数:-XX:+UseConcMarkSweepGC

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值