五.垃圾收集器

1. 垃圾收集器

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。以下讨论Update 14之后HotSpot虚拟机的垃圾收集器。
HotSpot虚拟机的垃圾收集器
以上图示展示了7中作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器。

1.1 Serial收集器

Serial收集器时最基本的、发展历史最悠久的收集器。这个收集器时一个单线程的收集器,但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。可想而知,如果你的计算机运行一小时就会暂停5分钟是什么心情?
Serial/Serial Old收集器运行示意图

1.2 ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本
ParNew/Serial Old收集器运行示意图
再此之后会涉及到两个名词:并发和并行,此处解释如下:

  1. 并行(Parallel):指多条垃圾收集线程并行工作,但是此时用户线程仍然处于等待状态。
  2. 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行与另一个CPU上。

1.3 Parallel Scavenge收集器

它使用复制算法,又是并行的多线程收集器。特点是它的关注点与其他收集器不同。
CMS等收集器的关注点是尽可能的缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)
吞吐量 = 运行用户代码时间/(运行用户代码时间 + 垃圾收集时间),例如:虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,则吞吐量就是99%

1.4 Serial Old收集器

Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。它的主要意义也是在于给Client模式下的虚拟机使用。
如果在Server模式下,那么它主要还有两大用途:

  1. 在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用。
  2. 作为CMS收集器的后备预案,在并发收集发生Concurrent Model Failure时使用。

Serial/Serial Old收集器运行示意图

1.5 Parallel Old收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。在注重吞吐量以及CPU资源敏感的场合,都可以有限考虑Parallel Old加Parallel Scavenge收集器。
Parallel Scavenge/Parallel Old收集器运行示意图

1.6 CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务上,尤其重视服务的响应速度,CMS收集器就非常符合这类应用的需求。也是基于“标记-清除”算法实现。优点是:并发收集、底停顿
Concurrent Mark Sweep收集器运行示意图

1.7 G1收集器

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

  • 并行与并发
  • 分代收集
  • 空间整合
  • 可预测的停顿
    G1收集器运行示意图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值