CMS前世今生

CMS一直是面试中的常考点,今天们用通俗易懂的语言简单介绍下。

垃圾回收器为什么要分区分代?


image.png

如上图:JVM虚拟机将堆内存区域分代了,先生代是朝生夕死的区域,老年代是老不死的区域,不同的年代对象有不同特性,因此需要不同的垃圾收集器去处理。如下图,黑竖线左边的区域都是分代垃圾收集器,G1之后内存就不分代了。

image.png

单线程垃圾收集器:Serial + Serial Old


Serial(SY),Serial Old(SO)是单线程垃圾收集器组合,垃圾收集线程是单线程的,随着现代内存区域越来越大,SY+SO组合已经越来越少了。垃圾收集的单线程需要STW时间无疑越长。这种组合比较合适较早JDK版本。如下图,用户线程表示应用程序处理过程,垃圾收集线程表示垃圾线程清理垃圾过程,此阶段应用程序是需要等待垃圾线程STW的。

image.png

多线程垃圾收集器:PS+PO


前面们说了,单线程垃圾收集器缺点就是当内存区域变大,收集效率会很低,那OK,摇身一变,如下图,多线程垃圾处理器。

image.png

值得注意的是:PS+PO组合是JDK1.7,JDK1.8默认垃圾收集器。通过java -XX:+PrintCommandLineFlags 命令可以在Dos界面查看。如下图,该命令可以查看JVM初始化的默认参数。比如:-XX:InitialHeapSize表示初始化堆大小。

image.png

为啥蹦出来个CMS+ParNew


并行处理有了,CMS+ParNew又是干嘛的?其实PO关注是吞吐量,而CMS关注是缩短STW时间。而CMS处理流程更复杂,至于ParNew,其实约等于PS,如果你注意最上面一个图,你会发现PS年轻代无法和CMS组合。所以就多出来了一个ParNew。

介绍CMS阶段


CMS,全名称Concurrent Mark Sweep,中文释义并发标记清除,从名字上可以看出算法思想使用标记清除算法,下面们看看CMS简化处理流程。

image.png

  • 初始标记。只标记GC root可达的第一个节点。会短暂的STW。
  • 并发标记。用户线程和垃圾线程同时进行。垃圾线程会继续向下寻找GCroot,不会有STW。但也会有两个问题。
  • 多标:之前不是垃圾,现在线程出栈引用断开了变成了垃圾。也称为浮动垃圾。
  • 错标:之前已经被标注是垃圾,但现在重新引用。
  • 重新标记。 STW时间一般低于200毫秒。
  • 并发清除。并发清除时,因为用户线程和垃圾线程一起工作,如果CMS线程异常,可能会触发SO单线程执行。程序可能会特别缓慢。

劣势:碎片严重。

总结


主要简单介绍了分代垃圾回收器,特别介绍了cms执行过程,G1留下次再说吧。好了,文章有地方还写的不清晰希望亲们加以指正和点评,喜欢的请点赞加关注哦。点关注,不迷路, 是叫练,边叫边练,公众号叫练 】,微信号【jiaolian123abc】。祝大家生活愉快。

[] ) [](top

原文创作:叫练

原文链接:https://www.cnblogs.com/jiaolian/p/14608663.html

文章列表

更多推荐

更多
  • Camel云原生-六、将应用部署到 Kubernetes 容器被抽象成称为pod的实体。pod 由一个或多个容器以及运行这些容器的必要配置组成。这种结构是 Kubernetes 真正精心安排的。pod ...
    Apache CN

  • Camel云原生-一、欢迎来到 Apache Camel 什么是系统集成?,业务还是集成逻辑?,云原生应用,什么是 ApacheCamel?,第四的,包装应用,摘要,集成逻辑,集成路由,交流和信息,表达式语言,Java 进化,微服务,开发要求,微文件规范,运行代码,快速汽车,优步罐,容器映像,
    Apache CN

  • Camel云原生-四、使用 Apache Camel 访问数据库 关系数据库,处理异常,摘要,JPA 的持久性,使用 JPA 的参数化查询,处理,尝试捕捉最终,错误处理程序,一个例外条款, 我们在实现 API 或集成时所做的大部分工作是移动数据。我们提供数据,消费数据,转换数据,复制数据,等等。这样,
    Apache CN

  • Camel云原生-五、使用 Apache Kafka 发送消息 面向消息的中间件,ApacheKafka,Camel 和 Kafka,摘要,概念和架构,安装和运行,测试安装,设置应用,首次测试,扩大消费者规模,偏移复位,单元测试应用, 在前面的章节中,我们主要关注跨应用通信的同步方法的使用,更具体地
    Apache CN

  • Camel云原生-二、开发 REST 集成 Camel DSLs,REST 和 OpenAPI,第一个应用:REST 文件服务器,摘要,REST 接口和 OpenAPI,可读性和逻辑重用,Beans 和处理器,述语,数据格式,类型转换器, 在上一章中,向您介绍了 Apache C
    Apache CN

  • Camel云原生-三、使用 Keycloak 保护 Web 服务 访问控制,用 Keycloak 保护 REST APIs,摘要,OAuth 2.0,OpenID 连接,凯克洛克,公开联系人列表 API,配置键盘锁,配置资源服务器,使用 Camel 消费 API, 我们一直在谈论 web 服务,方法是
    Apache CN

  • Kubernetes Serverless应用-十一、运行无服务器工作负载 不断发展的软件和平台,KubernetesKubernetesKubernetesKubernetesKubernetesKubernetesKubernetesKubernetesKubernetesKubernetes,无服务器工具
    Apache CN

  • Kubernetes Serverless应用-十、无服务器考虑事项 安全最佳实践,干燥 Kubernetes,保护无服务器服务,OpenFaaS,无内胎的,function函数,Apache OpenWhisk,分裂,结论,监视 Kubernetes,仪表板,谷歌云,Microsoft Azure,摘要
    Apache CN

  • Kubernetes Serverless应用-九、查看 OpenFaaS openfans 简介,在本地运行 openfans,OpenFaaS 命令行客户端,码头工人,启动 Minikube 集群,使用 helm 安装 openfans,你好世界!,openfans 用户界面和商店,普罗米修斯,摘要,
    Apache CN

  • Kubernetes Serverless应用-八、使用 Fission 启动应用 Fission 概述,安装先决条件,安装舵,安装 Fission 命令行界面,在本地运行 Fission,使用头盔发射 Fission,处理输出,启动我们的第一个功能,留言簿,Fission 命令,Fission 功能命令,创建命令,获
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多