垃圾收集器

hotspot虚拟机中提供了多款垃圾收集器,每款收集器有它的特点以及适用范围,开发人员可根据对象生命周期特点,内存使用情况等使用参数选择合适的垃圾收集器。

下面给出hotspot中所有虚拟机的结构图。这些虚拟机有些用于新生代垃圾手机,有些用于老年代垃圾手机,新生代垃圾收集器采用的都是复制算法,老年代垃圾手机采用的有标记-清除算法、标记-整理算法。
这里写图片描述

下面对这几种收集器做一个简单的总结:

1.Serial串行收集器

serial串行收集器是最基本、历史最长的收集器。

特点:新生代收集器,单线程收集器,在执行GC过程时,会暂定所有用户线程,GC完成之后其他用户线程才能继续执行。

缺点:执行GC过程暂定所有用户线程,如果内存大,垃圾多,GC时间过长,导致系统长时间没有反应,用户体验不好。

适用情况:单cpu情况下,没有线程交互开销,适用于Client模式,如桌面应用场景,分配给虚拟机的内存不会很大,几十到几百兆之间,内存不大时,回收速度会快。
这里写图片描述

2.ParNew收集器

Serial收集器是新生代单线程收集器,在多核,多cpu情况下,其cpu资源利用率不高,并且在待回收内存空间很大时,serial会让用户线程等待时间足够长。根据serial的不足之处,进行改进,将GC线程由单线程变为多线程。其他并无改变。在GC时,同样需要“STOP THE WORLD”。

优势:相比serial收集器,由单线程改进为多线程;相比Parallel收集器,能与老年代并发收集器CMS配合使用。

缺点:在单cpu情况下,收集效果不如Serial收集器,因为存在线程交互的开销。

**适用范围:**Server模式下的虚拟机中,因为server模式下必然是多核
这里写图片描述

3.Parallel Scanvage

与ParNew收集器一样,Parallel Scanvage收集器属于多线程的新生代收集器。与PaNew不同的地方是ParNew关注的是尽可能缩短GC时间,而Parallel Scanvage关注的是提高吞吐量(吞吐量=用户线程执行时间/(用户线程执行时间+GC线程执行时间))。所以,ParNew适用于与用户进行交互的环境下,停顿时间短,用户体验更好。提供两个参数用于控制停顿时间以及吞吐量

适用范围:高效率利用cpu时间,不需要与用户进行交互,在后台快速执行计算任务。

优势:提升吞吐量,自适应调节策略(根据系统运行情况,自适应调整相应jvm参数)
这里写图片描述

4.Serial Old

Serial收集器的老年代版本,同样是单线程环境下,采用的是标记-整理算法。

5.Parallel Old收集器

Parallel Scanvage的老年代版本,采用标记-整理算法。与Parallel Scanvage组合适用于注重吞吐量,cpu资源敏感的环境中。

6.CMS收集器

采用标记-清除算法,目标旨在缩短停顿时间。最大的特点是前面所提到的5款垃圾收集器,在执行GC线程时,会停顿用户线程,而CMS收集器将GC过程划分成4个步骤,在其中2个步骤中是可以并发执行,也即是执行用户线程的同时,其他cpu可以执行GC中的并发步骤。由于并发的加入,所以CMS收集器,系统停顿时间短。

适用范围:对响应时间要求比较高的B/S系统的服务端。

过程:

  1. 初始标记:标记出与GC Roots直接关联的引用,速度很快
  2. 并发标记:能与用户线程并发执行,标记出GC Roots引用链上所有对象
  3. 重新标记:由于并发标记时,用户线程也在执行,这一部分用于修改并发标记时部分引用变动的情况。
  4. 并发清除

在以上4个步骤中,初始标记和重新标记必须要暂停用户线程,但是这俩个步骤执行速度很快,并发标记和并发清除,耗时较长,与用户线程可以并发执行。

缺点:

  • 无法处理浮动垃圾,可能会出现“Concurrent Mode Failure”而导致FULL GC,这是由于在并发标记过程中会产生新垃圾,而新的垃圾只能等到下次垃圾收集时再进行清除。由于CMS在执行GC的过程中还可以执行用户线程,所以需要预留一定的空间,不能等到空间快满时才进行GC,如果预留的空间不够新对象所需的空间,将会发生“Concurrent Mode Failure”,此时会将Serial Old作为老年代收集器,进行垃圾回收。
  • 空间碎片,由于CMS采用标记-清除算法,所以容易产生空间碎片,如果大对象找不到足够的连续空间,将会频繁地启用FULL GC,同样影响系统性能。在CMS中,针对空间碎片问题,CMS提供了一个可以进行内存整理的开关参数。
  • 对cpu资源敏感,在并发阶段,由于占用了用户线程,所以吞吐量会下降。

这里写图片描述

7.G1收集器

G1收集器是面向服务端应用的一款收集器。

特点:

  • 与CMS收集器一样,是一款并发并行的收集器,支持GC过程用户线程可以继续执行
  • 分代收集,不同于前面所提到的几款收集器,只能用于新生代或者老年代,而CMS可以管理整个java堆,G1收集器将java堆区域划分成多个大小相等的区域。
  • 空间整合,CMS整体采用标记-整理算法,区域之间采用复制算法。
  • 可预测的停顿,能让使用者明确指定在一个时间长度为N毫秒的时间片段内,消耗在垃圾收集上的时间不超过m毫秒,后面对原因进行说明。

为什么G1收集器可以达到可预测的停顿?

G1收集器将java堆划分成大小相等的独立区域,通过跟踪各个区域里面垃圾堆积的价值大小,(回收所获得空间大小以及回收所需时间的经验值),在后台维护一个优先列表,根据允许收集时间,选择一个价值最大的区域进行回收。

过程

  1. 初始标记
  2. 并发标记
  3. 最终标记
  4. 筛选回收:对各个区域中的回收价值进行排序,选择允许时间内,价值最大的进行回收

G1收集器的过程与CMS过程类似。
这里写图片描述

总结:上面提到了7款收集器,每款收集器都有适用场景,特点,需要根据应用环境进行设置最适合的收集器。其中新生代收集器有Serial单线程收集器,适用于client模型下单cpu内存不大的应用场景、ParNew改进了Serial单线程的不足,升级为多线程,适用于server模式下多cpu,Parallel Scanvage与ParNew类似,不同在于更关注吞吐量,适用于不需要与用户进行交互的场景。
老年代收集器有Serial Old单线程,Parallel Old是Parallel Scanvage的老年代版本,配合使用,构造一个更关注吞吐量的组合,CMS是一个并发的多线程收集器,功能强大。
G1是一款功能强大的收集器,完美收集新生代老年代垃圾。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值