Java经典垃圾收集器

1.Serial收集器

Serial收集器是最基础,历史最久远的收集器,是一款新生代收集器,新生代收集采用的是“标记-复制算法”;它的工作方式是“单线程”。此处的单线程不仅是指它只会用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强调它在垃圾收集的时候,必须暂停其他所有工作的线程,包括用户线程,知道它收集结束。所以说,“Stop The World”(STW)可不是白叫的。

2.ParNew收集器

ParNew收集器实际上是Serial收集器的多线程并行版本,从名字就可以看出它也是一款新生代的收集器。

但是此处的多线程并行不是说它可以没有SWT,下面解释一下收集器并发和并行的概念:

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

3.Parallel Scavenge收集器

Parallel Scavenge收集器也是一款新生代的收集器,同样基于“标记-复制算法”实现,工作方式也是并行收集的多线程收集器。但它有一个最大特点是:尽量达到一个可控制的吞吐量。

比如完成一个任务,用户代码加上垃圾收集共花费了100秒,其中垃圾收集花费1秒,那吞吐量就是99%。

4.Serial Old收集器

Serial Old收集器是Serial收集器的老年代版本,同样的单线程,区别在于基于“标记-整理算法”实现。

5.Parallel Old收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于“标记-整理算法”实现。

6.CMS收集器

CMS(Concurrent Mark Sweep)收集器是一款基于“标记-清除算法”实现的,以获取最短回收停顿时间(缩短STW时间)为目标的收集器,它的运作更加复杂,整个过程分为以下四步:

(1)初始标记:标记以下GC Roots能直接关联到的对象,速度很快,需要"STW"

(2)并发标记:从GC Roots的直接关联对象开始遍历整个对象图,速度比较慢,但是不需要"STW"

(3)重新标记:标记那些刚刚并发标记期间,可能被用户重新抛弃的对象,速度比初始标记稍长,需要"STW"

(4)并发清除:清理被标记的已死亡的对象,由于不需要移动存活对象,所以可以并发执行,不需要"STW"

由于初始标记和重新标记的时间很短,因此CMS收集器可以理解为是内存回收的过程和用户线程一起并发执行的。

7.Garbage First收集器

Garbage First(简称G1)收集器是一款具有“停顿时间模型”的收集器,而实现这一模型的关键是基于Region的堆内存布局。这款收集器就像T1(faker)一样,很强,是当前介绍的几款里最强的

停顿时间模型的意思是能够支持指定在一个长度为M毫秒的时间内,消耗在垃圾收集上的时间大概率不超过N毫秒这样的目标。我们可以理解为:终于可以设置我想要的垃圾回收时间啦。

Region:将连续的Java堆划分为多个大小相等的独立区域,每一个区域都就是一个Region。它的不凡之处在于,每一个Region都可以根据需要扮演不同的角色:可以是Eden空间,可以是Survivor空间,也可以是老年代空间。值得一提的是Region中还有一类特殊的Humongous区域,专门用来存储大对象(占一个Region大小容量一半的对象),而G1收集器一般把该区域的对象当做老年代来处理。

在这里插入图片描述

G1收集器的运作过程分为以下四步:

1.初始标记:标记一下GC Roots能直接关联到的对象,需要短暂停顿,耗时很短。

2.并发标记:从GC Root 开始对堆中对象进行可达性分析,找到要回收的对象,耗时较长,但是和用户线程并发执行,没有"STW"。当对象图扫描完成后,还要重新处理刚刚并发时有引用变动的对象。

3.最终标记:对用户线程做另外一个短暂的暂停,用于处理并发阶段结束后仍然遗留下来的最后那少量的SATB记录。

4.筛选回收:先更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户指定的时间(停顿时间模型在此处展现)来选择要回收的多个Region,将这些Region中存活的对象复制到空的Region中,再清理掉整个旧的Region的全部空间。这里涉及移动存活的对象,所以需要暂停用户线程,由多条收集器线程并行完成。

可见G1收集器除了并发标记以外,其他阶段都需要暂停用户线程,它并不是纯粹地追求低延迟,而是在延迟可控的情况下获得尽可能高的吞吐量,所以才担得起“全功能收集器”的重任和期望。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>