JVM垃圾收集器分类

垃圾收集器的种类和区别

垃圾收集器其实就是内存回收的具体实现。垃圾收集器的种类主要分为以下几种:

Serail收集器

这个是一个单线程的收集器,它的“单线程”的意义不仅仅说明它只会用一个cpu或者一条收集线程去进行垃圾收集工作,更重要的是它在垃圾收集的时候,必须暂停其他所有的工作线程,直到它收集结束。运行示意图如下:

serail收集器运行示意图
因此针对于单个cpu的环境来说,这个是最简单高效的收集器。

ParNew收集器

ParNew收集器就是Serail收集器的多线程版本。运行示意图如下:
在这里插入图片描述
该收集器默认开启的线程数跟cpu个数相等,可以使用命令-XX:ParallelGCThreads参数限制垃圾收集的线程数。

Parallel Scavenge收集器

Parallel Scavenge收集器是一个新生代收集器,它是使用复制算法的收集器,又是并行的多线程收集器。Parallel Scavenge收集器的关注点与其他收集器不同,CMS等收集器的关注点是尽可能缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目的则是达到一个可控制的吞吐量。所谓吞吐量就是CPU运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis以及直接设置大小的参数-XX:GCTimeRadio。
该收集器也经常被称为“吞吐量优先”收集器。设置参数-XX:UseAdaptiveSizePolicy以后,就不需要手工指定新生代的大小(-Xmn)、Edan与Survivor区的比例(-XX:SurvivorRatio)等等细节参数,虚拟机会跟根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量,这种方式成为GC自适应的调节策略。自适应调节策略是Parallel Scavenge收集器和ParNew收集器的一个重要区别。

Serial Old 收集器

Serial Old 是Serial 收集器的老年代版本,它同样是一个单线程收集器,使用的标记-整理法。

Parallel Old 收集器

Parallel Old 是 Parallel Scavenge 收集器的老年代版本,使用多线程和标记-整理算法

CMS收集器

CMS收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器是基于标记-清除算法。整个回收过程包括以下步骤:

  • 初始标记

  • 并发标记

  • 重新标记

  • 并发清除
    其中,初始标记和重新标记这两个步骤需要暂停所有用户线程。初始标记仅仅只是标记一个GC Roots 能直接关联的对象,速度很快。并发标记过程就是进行GC Roots 跟踪的过程。重新标记阶段就是为了修正在并发标记过程中产生变动的那一部分对象。
    CMS收集器的优点包括并发收集、低停顿。但是包括一下三个明显缺点

  • 对CPU资源非常敏感,并发进行垃圾回收的时候,会运用较多的系统资源,导致用户的cpu运用资源变少,用户程序执行速度降低。

  • CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次FUll GC的产生。 浮动垃圾就是在并发清理过程中出现的新的垃圾,这部分垃圾出现在标记之后,CMS无法在当此收集中处理掉,只能留在下一次GC。如果收集过程中,内存不够程序运行,就会出现一次"Concurrent Mode Failure”失败,这时,虚拟机会启动备案:临时启用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间就更长了。

  • 标记-清除算法的收集器,会产生大量的空间碎片。空间碎片过多的时候会出现给大对象分配带来麻烦,会出现还有空间但是分配不了的情况,不得不再次Full Gc。为了解决这个问题,CMS收集器提供一个 -XX:+UseCMSCompactAtFullCollection开关参数(默认就是开启的),用于在CMS收集器顶不住要进行Full Gc时开启内存碎片的合并整理过程,内存整理的过程是无法进行并发的,空间碎片的问题没有了,但停顿时间变长了。虚拟机还设计了另外一个 参数来设置执行多少次不压缩的Full GC后,跟着来一次带压缩的(默认值是0,表示每次进入Full Gc时都进行一次压缩)。

G1 收集器

G1收集器时一款面向服务端应用的垃圾收集器。具备以下优点:

  • 并行和并发
  • 分代收集
  • 空间整合 (基于标记-整理算法)
  • 可预测的停顿(能够使使用者明确在一个长度为N的时间片段内,消耗在垃圾回收集上的时间不得超过N毫秒)
    低停顿效果比CMS收集器更好。

总结:

单线程:Serial serialOld
多线程:ParallelScavenger、 ParallelScavenge Old 、 CMS、G1
吞吐量:ParallelScavengeOld、 CMS
低停顿:G1、 CMS

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值