每日一面——Java的CMS收集器你了解多少?

菜鸡每日一面系列打卡27

每天一道面试题目 

助力小伙伴轻松拿offer

坚持就是胜利,我们一起努力!

题目描述

Java的CMS收集器你了解多少?

题目分析

其实,对于JVM内存管理相关问题的考查,很难区分哪道题目出现频率更高,因为基本上都是结合在一起考查的。面试官问完了运行时数据区,如果回答得不错,很自然地就会过渡到垃圾回收算法,进而考查垃圾收集器。

在这里,菜鸡想啰嗦两句。自动内存管理是Java的一个很重要的特点,它屏蔽了繁杂的内存管理的操作,将其交由垃圾收集器来进行管理,听起来很棒,但这也导致了Java程序员对底层的生疏,排查问题的困难。因此,很有必要了解JVM内存管理的相关原理,这对排查内存泄漏,内存溢出等问题是至关重要的。

在上一篇文章中,我们讲述了垃圾回收的基础知识,垃圾收集算法和分代收集理论,而本文要讲到的就是基于之前理论的实践篇——垃圾收集器。本文主要讲述CMS收集器,它是一款十分经典的垃圾收集器,是HotSpot虚拟机追求低停顿的第一次成功尝试,直到现在也在被广泛使用,在面试中也比较热门。接下来,随菜鸡一起去看看吧!

题目解答

01

CMS收集器基础

CMS收集器全称Concurrent Mark Sweep收集器。让我们先来通过名字YY一下这款收集器的特点:Concurrent,能并发收集?Mark Sweep,采用标记-清除算法?很遗憾……这些YY都是对的,这也说明CMS这个命名相当成功啊。

咳咳,严肃一点。

  • CMS收集器是一种以获取最短回收停顿时间为目标的收集器。它适用于对服务响应速度要求比较高的场景,因为这类系统希望停顿时间尽可能短,从而带给用户更好的交互体验。

  • CMS收集器是基于标记-清除算法实现的。CMS的标记-清除过程分为4个步骤。

    • 初始标记(stop the world):标记GC Roots能直接关联到的对象。

    • 并发标记(concurrent):从GC Roots的直接关联对象遍历整个对象图。

    • 重新标记(stop the world):修正并发标记期间用户线程运作过程中产生变动的对象的标记记录。

    • 并发清除(concurrent):清除死亡的对象。

02

对CMS收集器的评价

  • 优势

    • 并发低停顿。根据上述内容,由于初始标记与重新标记阶段的耗时远小于并发标记和并发清除阶段的耗时,因此,可以称CMS是一款并发低停顿的收集器。

    • 提高用户体验。基于并发低停顿的特点,CMS收集器成为了追求用户体验场景下的优秀选择。

  • 缺点

    • 对处理器资源非常敏感。并发过程很吃CPU,会降低总吞吐量。

    • 无法处理“浮动垃圾”。所谓的浮动垃圾是指在并发标记和并发清理阶段产生的新的垃圾对象,这部分对象如果逃脱了标记过程,就不能在当次垃圾手机过程中被回收。

    • 基于标记-清除算法会产生大量内存碎片。上篇文章已经提到过,标记-清除算法的后遗症就是会产生大量的内存碎片,碎片过多会导致大对象申请连续空间失败,而不得不提前触发Full GC。为了应对这种问题,在内存碎片过多时,CMS收集器会采用标记-整理算法收集一次,以获得规整的空间。

参考资料

《深入理解Java虚拟机》第3版 周志明

相关链接

每日一面——Java的垃圾回收你了解多少?

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值