JVM垃圾回收器有哪些

本文详细介绍了Java垃圾回收器的不同类型和工作原理,包括Serial、ParNew、ParallelScavenge、SerialOld、ParallelOld、CMS和G1。CMS收集器以最短停顿时间为目标,而G1则注重整体吞吐量。各收集器使用不同的算法,如标记-复制、标记-整理和标记-清除,并在不同场景下有不同的优势和挑战。
摘要由CSDN通过智能技术生成

分析&回答


一、Serial收集器(新生代、复制算法)

这是一个单线程工作的收集器,这个单线程并不是只用一条线程完成垃圾回收的操作,而是在进行垃圾回收的时候,必须停掉其他所有的工作线程,直到它收集结束。

image.png

二、ParNew收集器(新生代、复制算法)

ParNew收集器实质上是Serial收集器的多线程并行版本,可以同时采用多条线程进行垃圾处理。

image.png

三、Parallel Scavenge收集器(新生代、复制算法)

Parallel Scavenge收集器是一款新生代收集器,基于标记复制算法,能够并行收集。特点是其关注点和其他收集器不一样,它的目标是达到一个可控的吞吐量,而不是向CMS等收集器一样尽可能的缩短垃圾收集的时候用户线程的停止时间。

image.png

四、Serial Old收集器(老年代、整理算法)

Serial Old收集器是Serial收集器的老年代版本,同样是一个单线程的收集器,使用标记-整理算法,有俩种用途:一是在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用;二是作为CMS收集器失败之后的后预案。

image.png

五、Parallel Old收集器(老年代、整理算法)

Parallel Old是Parallel Scavenge的老年代版本,支持并发收集,基于标记-整理算法实现。在注重吞吐量或者处理器资源较为稀缺的场合,优先选取Paralle Scavenge + Parallel Old的搭配方式。

image.png

六、CMS收集器(Concurrent Mark Sweep)

CMS收集器是一种以获取最短停顿时间为目标的垃圾收集器。从名字上就可以看出CMS收集器是基于标记-清除法的垃圾收集器,运作过程要相对来说复杂一些,整个过程分为四个阶段:

  1. 初始标记:标记GC Roots能直接关联到的对象,速度很快,需要暂停用户线程;
  2. 并发标记:是指从GC Roots的关联对象开始遍历整个对象图的过程,耗时比较长但是不要需要暂停用户线程;
  3. 重新标记:修正在并发标记期间,因用户线程继续运作导致标记产生变动的那一部分对象的标记记录,需要暂停用户线程,但是时间相对并发标记阶段还是很短的;
  4. 并发清除:清理掉标记阶段已经死亡的对象,由于使用清除算法,不需要移动对象,因此不需要暂停用户线程,并发清除;

总的来说,CMS收集器的内存回收是和用户线程是一起并发执行的。
image.png

CMS垃圾回收器主要有如下三个缺点

  1. CMS收集器对处理器资源非常敏感。CMS的默认回收线程数是(处理器核心数+3)/4,CPU的核心数越少,CMS回收对用户线程的影响就越大。
  2. CMS收集器无法回收浮动垃圾,有可能出现一次并发清除失败而导致暂停用户线程进行Full GC。在CMS的并发清理阶段,用户线程还是在运行的,程序在结束以后会有新的垃圾产生,但是这部分垃圾CMS无法在当此清除他们,只能在下一次再次清除,这部分垃圾就叫浮动垃圾。在进行垃圾清理的过程中,由于用户线程还在运行中,因此需要留下一块空间供用户线程使用。当CMS运行期间预留的内存无法满足用户线程新建对象的需要,就会出现并发清除失败,进而使用Serial Old收集器来暂停用户线程收集老年代的垃圾。
  3. CMS是基于标记清除算法的垃圾回收器,那么就会产生内存碎片,这样分配大对象就会遇到麻烦,不得不提前触发一次Full GC。

七、G1回收器(Garbage First)

G1回收器是一款主要面向服务端应用的垃圾回收器,JDK9之后,它替代了Parallel回收器。G1回收器可以面向堆内存中的任意地方来回收内存(Mix GC),没有被局限在新生代、老年代、和整堆回收中。

G1回收器中的基于Region的堆内存布局是实现上述目标的关键。G1将Java堆分为多个大小相等的独立区域(Region),每个Region都可以根据需要扮演新生代的Eden空间、Survivior空间以及老年代空间。Region中还有一个特殊的Humongos区域,用于存储大对象,当大对象的大小超过单个Region的时候,这个对象会被放在多个连续的Humongos Region中,G1会把这个区域当作老年代来处理。

G1收集器的新生代和老年代并不是固定的,他们都是一系列区域(不需要连续)的动态集合,G1进行垃圾回收的时候Region是垃圾回收的最小单元,每次收集的内存空间是G1的整数倍,有限回收收益最大的区域,能够让G1收集器在有限的时间内获取尽可能高的手机效率。

G1收集的过程大致分为以下四个步骤:

  1. 初始标记:标记GC Roots能直接关联到的对象,并且修改TAMS指针的值,让下一阶段的用户线程并发工作的时候能正确的在可用Region中分配新对象,此阶段需要停止用户线程,但是时间短,而且是在Minor GC中同步完成的。
  2. 并发标记:从GC Roots开始对堆中的对象进行可达性分析,扫描整个堆,耗时较长,但是和用户进程是并发进行的;
  3. 最终标记:对用户线程做另一个短暂的暂停,用户处理并发阶段结束后遗留的少量的STAB记录;
  4. 筛选回收:对各个Region的回收价值和成本进行排序,根据用户期望的停顿时间来制定停顿计划,把回收的那部分Region中存活的对象复制到空的Region中,再清理掉旧的Region中的全部空间,涉及对象的复制移动,需要暂停用户线程

image.png
G1在整体上是基于标记整理算法实现的,但是从俩个Region来看,是基于标记复制算法,这俩种方法确保G1在垃圾回收的时候不会产生内存碎片。


喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵呜刷题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值