热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

CMS收集器,哪些垃圾回收器可以搭配CMS使用

文章目录GC步骤初始标记并发标记并发预处理重新标记并发清除CMS的缺点总结:垃圾收集器分为年轻代和老年代。CMS全程为ConcurrentMarkSweep

文章目录 GC步骤初始标记并发标记并发预处理重新标记并发清除 CMS的缺点总结:
垃圾收集器分为年轻代和老年代。


CMS全程为Concurrent Mark Sweep,即并发标记清除,对比以上的收集器,最大的区别在于并发:在GC线程工作的时候,用户线程不会完全停止,用户线程在部分场景下与GC线程一起并发执行。但是,无论是什么垃圾收集器,Stop the world是一定无法避免的。CMS只是在部分的GC场景下可以让GC线程与用户线程并发执行。

CMS的涉及目的是为了避免【老年代GC】出现长时间的卡顿(stop the word)。

CMS主要是实现了标记清除垃圾回收算法,可分为5个步骤:

初始标记并发标记并发预清理重新标记并发清除 GC步骤 初始标记

初始标记会标记GCRoots直接关联的对象以及年轻代指向老年代的对象,初始标记这个过程会发生Stop the word。但是这个阶段的速度很快,因为没有向下追溯,即只标记一层。

并发标记

这个过程不会停止用户线程(即不会发生stop the world),这一阶段主要是GC Roots向下追溯,标记所有可达的对象,该阶段比较耗时,因为需要追溯。

并发预处理

这个阶段主要目的就是【减少下一阶段重新标记所消耗的时间】,因为下一阶段重新标记需要Stop the World.

并发标记阶段由于用户线程是没有被挂起的,所以对象有可能是发生变化的。可能有些对象,从潇洒的小懒猪代晋升到了老年代;可能有些对象,直接被分配到了老年代(大对象)。可能老年代或者潇洒的小懒猪代的对象引用发生了变化…
解决该问题就是——针对老年代的对象,可以借助类card table的存储,将老年代对象发生变化所对应的卡页标记为dirty.

所以并发预处理这个阶段会扫描可能由于并发标记时导致老年代发生变化的对象,会再扫描一边标记为dirty的卡页。

对于潇洒的小懒猪代的对象,还需要遍历潇洒的小懒猪代在并发标记过程中有没有对象引用了老年代。JVM提供了很多参数,可能在这个过程中触发一次minor GC(触发GC意味着可以更少地遍历潇洒的小懒猪代的对象)

重新标记

该阶段你会Stop the world,这里停顿的时间很大程度上取决于并发预处理阶段

并发清除

该阶段不会发生stop the world,用户线程一边执行,GC线程一边在回收不可达对象。这个过程可能存在用户线程在不断产生垃圾,但也只能留到下一次GC进行处理,这些垃圾又称为"浮动垃圾"。

全部结束后会重置CMS算法相关的内部数据,为下一次GC循环做准备。

以上就是CMS回收垃圾的过程,其实就是把垃圾回收的过程给细分了,然后再某些阶段可以不停止用户线程,一边回收垃圾,一边处理请求,来减少每次垃圾回收时stop the word的时间。当然,中间也做了很多的优化,比如dirty card标记,中途触发minor GC等等

CMS的缺点

空间需要预留:CMS垃圾收集器可以一边回收垃圾,一边处理用户线程,那需要在这个过程中保证有充足的内存空间供用户使用。如果CMS运行过程中预留的空间不够用,会报错,这时会启动Serial Old垃圾收集器进行老年代的垃圾回收,会导致停顿的时间很长。

内存碎片问题:CMS本质上是实现了标记清除算法的收集器,这意味着会产生内存碎片,由于碎片太多,又可能导致内存空间不足所触发full GC,CMS一般会触发full GC这个过程堆碎片进行整理。整理涉及到【移动】和【标记】,这个过程肯定会stop the world,如果内存足够大,这个过程卡顿也需要一定的时间。

综合来看,使用CMS的弊端好像一个死循环:

内存碎片过多,导致空间利用率降低,空间本身就需要预留给用于线程使用,现在碎片化又加剧了空间的问题,可能导致垃圾收集器降级为Serial Old,卡顿时间更长;要处理内存碎片问题,同样会卡顿。
所以,目前企业中一般都使用G1。

总结:

CMS垃圾回收器设计目的:为了避免「老年代 GC」出现「长时间」的卡顿(Stop The World)

CMS垃圾回收器回收过程:初始标记、并发标记、并发预处理、重新标记和并发清除。初始标记以及重新标记这两个阶段会Stop The World

CMS垃圾回收器的弊端:会产生内存碎片&&需要空间预留:停顿时间是不可预知的


推荐阅读
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 通过与阿里云的合作,牛客网成功解决了跨国视频面试中的网络卡顿问题,为求职者和面试官提供了更加流畅的沟通体验。 ... [详细]
author-avatar
恋若寒1999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有