JVM CMS和G1执行过程比较

news2024/11/28 3:29:15
CMS

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。由于大部分 Java 应用主要集中在互联网网站以及基于浏览器的 B/S 系统的服务端,这类应用通常会较为关注服务的响应速度,希望系统的停顿时间尽可能少,CMS 收集器就非常符合这类应用的需求

从名字可以知道,CMS 收集器是基于标记 - 清除算法实现的,它的运作过程分为四个步骤:

  1. 初始标记(CMS initial mark)

    仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要 Stop The World

  2. 并发标记(CMS concurrent mark)

    就是从 GC Roots 的直接关联对象开始遍历整个对象图的过程,耗时较长,但不需要停顿用户线程,可与垃圾收集器线程一起并发执行

  3. 重新标记(CMS remark)

    该阶段是为了修正并发标记期间,因用户程序运作而导致标记产生变动的那一部分对象的标记记录,这个阶段需要 Stop The World,而且停顿时间通常比初始阶段稍长一些,但也远比并发标记阶段的时间短

  4. 并发清除(CMS concurrent sweep)

    清理删除掉标记阶段判断已经死亡的对象,由于不需要移动存活对象,所有这个阶段可以和用户线程并发执行

由于整个过程中耗时最长的是并发标记和并发清除阶段,而这两个阶段都可以和用户线程并发执行,所以从总体上看,CMS 收集器内存回收过程是与用户线程一起并发执行的

CMS 收集器的主要优点就是:并发收集、低停顿,因此也称 CMS 收集器为并发低停顿收集器。但 CMS 还远未达到完美的程度,它至少有以下四个明显的缺点:

  1. 对处理器资源非常敏感

    在并发阶段,CMS 虽然不会导致用户线程停顿,但却会因为占用了一部分线程(或者说是处理器的计算能力)而导致应用程序变慢,降低吞吐量。处理器核心数在四个或以上那还好,如果不足四个,CMS 会占用将近一半的运算能力去执行收集器线程,这将导致用户程序的执行效率大幅降低

  2. 无法处理浮动垃圾

    在 CMS 的并发标记和并发清理阶段,由于用户线程继续运行,因此有可能会有新的垃圾对象产生。但这一部分垃圾对象是出现在标记结束之后,CMS 无法在当次收集中处理掉它们,只能留待下一次垃圾收集在清理,这一部分垃圾就称为浮动垃圾

  3. 可能会出现并发失败

    同样也是由于垃圾收集阶段用户线程还需持续执行,那就必须预留足够的内存空间供用户线程使用。因此 CMS 收集器不能像其他收集器那样等老年代几乎完全填满再进行收集,而必须预留一部分空间供并发收集时的程序运作使用,这部分空间的大小可以通过 -XX:CMSInitiatingOccu-pancyFraction 参数来设置。如果 CMS 运行期间预留的内存无法满足程序分配对象的需要,就会出现一次并发失败,这时虚拟机不得不启用预备方案:冻结用户线程,临时启用 Serial Old 收集器来重新进行老年代的垃圾收集,导致 Stop The World

  4. 大量空间碎片的产生

    CMS 是一款基于标记 - 清除算法实现的收集器,这也意味着收集结束时会产生大量空间碎片。为了解决这个问题,CMS 收集器提供了一个 -XX:+UseCMS-CompactAtFullCollection 开关参数,用于在收集结束后做一次内存整理,以及 -XX:CMSFullGCsBefore-Compaction 参数,要求 CMS 收集器在执行若干次不整理空间的 Full GC 之后,下一次 Full GC 前先做一次碎片整理

G1

Garbage First(G1)收集器是一款主要面向服务端应用的垃圾收集器,开创了收集器面向局部收集的设计思路和基于 Region 的内存布局形式。HotSpot 开发团队对 G1 收集器的期望就是能在将来替代 CMS 收集器,所以在 JDK9 发布之日,G1 便宣告取代 Parallel Scavenge 加 Parallel Old 组合,成为服务端模式下的默认垃圾收集器,而 CMS 则沦为不推荐使用

在过去,包括 CMS 在内,垃圾收集的范围要么是整个新生代,要么是整个老年代,再要么是整个 Java 堆。而 G1 可以面向堆内存任何部分来组成回收集(Collection Set,一般简称 CSet)进行回收,衡量标准是哪块内存中垃圾数量最多,回收收益最大,这就是 G1 收集器的 Mixed GC 模式

虽然 G1 也是基于分代收集理论设计,但其对内存布局与其他收集器有明显差异。G1 把连续的 Java 堆划分成多个大小相等的独立区域(Region),每一个 Region 可以根据需要扮演新生代的 Eden 空间、Survivor 空间、老年代空间等等。收集器能对扮演不同角色的 Region 采用不同的策略处理

Region 中还有一类特殊的 Humongous 区域,专门用来存储大对象。只要该对象大小超过一半的 Region 的容量即可判定为大对象。而对于那些超过整个 Region 容量的超级大对象,将会被存放在 N 个连续的 Humongous Region 之中,G1 的大多数行为都把 Humongous Region 作为老年代的一部分来看待

停顿时间模型的意思是能够支持指定在一个长度为 M 毫秒的时间片段内,消耗在垃圾收集上的时间大概率不超过 M 毫秒这么一个目标。G1 收集器作为 CMS 收集器的替代者,自然可以实现这个目标

G1 之所以能建立起可预测的停顿时间模型,是因为它将 Region 作为单词回收的最小单元,即每次收集到的内存空间都是 Region 大小的整数倍,这样可以有计划地避免进行全区域的垃圾收集。G1 收集器还可以跟踪每个 Region 的垃圾堆积的“价值”大小,即回收所获得的空间大小以及所需时间,并在后台维护一个优先级列表,每次根据用户设置的允许收集停顿时间(使用 -XX:MaxGCPauseMillis 指定),优先处理回收价值最大的 Region。这种使用 Region 划分内存空间,以及具有优先级的区域回收方式,保证了 G1 收集器在有限的时间内获取尽可能高的收集效率

G1 收集器的设计理念看似无太多惊人之处,其实有很多关键的细节问题需要解决:

  • 如何解决跨 Region 引用对象?

    这个问题的解决思路可以使用之前提到过的记忆集来处理,但由于每个 Region 都要维护自己的记忆集,因此实现更加复杂,而且内存占用负担也更重

  • 并发标记阶段如何保证收集线程与用户线程互不干扰?

    对应该问题,CMS 采用增量更新算法解决,而 G1 采用原始快照算法解题。另外,G1 还为每一个 Region 设计了两个名为 TAMS(Top At Mark Start)的指针,用于在并发回收过程中新对象的内存分配。G1 收集器默认在这个地址以上的对象是存活的,不会纳入回收范围

  • 如何建立起可靠的停顿预测模型?

    G1 收集器的停顿时间模型是以衰减均值(Decaying Average)为理论基础实现的。衰减均值是指它会比普通的平均值更容易受新数据影响,因此,Region 的统计状态越新,越能决定其回收的价值

G1 收集器的运作过程大致可划分为以下四个步骤:

  1. 初始标记

    仅仅标记一下 GC Roots 能直接关联的对象,并修改 TAMS 指针的值。该阶段需停顿线程,但耗时很短,而且是借进行 Minor GC 时同步完成的,实际上并没有额外的停顿

  2. 并发标记

    从 GC Roots 开始对堆中对象进行可达性分析,找出要回收对象。该阶段耗时较长,但可与用户程序并发执行。当扫描完成后,还要重新处理 SATB 记录下在并发时有引用变动的对象

  3. 最终标记

    用户线程短暂暂停,处理并发阶段结束后遗留下来的少量 SATB 记录

  4. 筛选回收

    更新 Region 统计数据,对各个 Region 的回收价值和成本进行排序,根据用户所期望的停顿时间制定回收计划,然后把要回收的那一部分 Region 的存活对象复制到空的 Region 中,再清理掉整个旧 Region 的全部空间。这里涉及到存活对象的移动,必须暂停用户线程

G1 和 CMS 都非常关注停顿时间控制,毫无疑问,可以由用户指定期望的停顿时间是 G1 收集器的一大杀手锏。G1 收集器经常被拿来和 CMS 收集器比较,从长远来看,G1 收集器肯定是会取代 CMS 收集器的

除了更先进的设计理念,单从传统的算法理论来看,G1 从整体来看是基于标记 - 整理算法实现,而从局部来看(两个 Region 之间)又是基于标记 - 复制算法实现,这意味着 G1 不会产生内存碎片。但 G1 并非全方面碾压 CMS,G1 由于其复杂的内部细节实现,使得垃圾收集时的内存占用和程序运行时的额外执行负载都要比 CMS 高。使用哪款收集器,往往要针对具体场景才能做定量比较,目前在小内存应用上 CMS 的表现大概率会优于 G1,而在大内存应用上 G1 则占有优势,这个平衡点通常在 6GB ~ 8GB 之间。当然,随着 HotSpot 开发者对 G1 的持续优化,最终胜利的天平必定回向 G1 倾斜



作者:CoderZS
链接:https://www.jianshu.com/p/1a6c00173cd1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1070080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公司软文怎么写?如何写好软文?

软文,即柔性广告,是通过文字、图片等形式,以一种隐性的方式,将广告信息融入到文章中,以达到宣传、推广的目的。它相较于硬广告,更能深入人心,更易被接受。 首先,软文能够提升品牌的…

xlsx使用table_to_book报错Uncaught Unsupported origin when DIV is not a TABLE

背景:const workbook XLSX.utils.table_to_book(document.querySelector(‘#table-export’),{ raw: true//保留原始字符串 })报错Uncaught Unsupported origin when DIV is not a TABLE 原因:el-table是div格式 过程1:获取深层次的table…

使用Docker安装JupyterHub

安装JupyterHub 拉取Jupyter镜像并运行容器 docker run -d -p 8000:8000 --name jupyterhub jupyterhub/jupyterhub jupyterhub # -d:后台运行 # -p 8000:8000:宿主机的8000端口映射容器中的8000端口 # --name jupyterhub:给运行的容器起名…

H3C 防火墙策略

H3C防火墙有安全策略和域间策略,安全策略的优先级大于域间策略,会优先匹配安全策略,匹配不到才会匹配域间策略 域间策略:any to any的域间策略优先级低于具体的区域到具体的区域的域间策略 安全策略匹配顺序:从上到下…

剑指offer——JZ34 二叉树中和为某一值的路径(二) 解题思路与具体代码【C++】

一、题目描述与要求 二叉树中和为某一值的路径(二)_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过…

第 366 场周赛 LeetCode 周赛题解

A 分类求和并作差 模拟 class Solution { public:int differenceOfSums(int n, int m) {int res 0;for (int i 1; i < n; i)res i % m ! 0 ? i : -i;return res;} };B 最小处理时间 排序&#xff1a;设四个 p r o c e s s o r T i m e processorTime processorTime 的元…

【LeetCode 算法专题突破】二分查找(⭐)

文章目录 前言1. 二分经典模板题目题目描述代码&#xff1a; 2. 在排序数组中查找元素的第一个和最后一个位置题目描述代码 3. 有效的完全平方数题目描述代码 4. 寻找峰值题目描述代码 5. 寻找旋转排序数组中的最小值题目描述代码 6. 点名题目描述代码 总结 前言 我刷过不少算…

java: 警告: 源发行版 17 需要目标发行版 17

一、遇到问题&#xff1a; java: 警告: 源发行版 17 需要目标发行版 17 二、分析原因&#xff1a;JDK版本不一致 在idea中编辑器中修改JDK配置 三、解决问题 找到settings -- Build,Execution,Deployment -- compiler -- JavaCompiler 进行更改版本 另外还要找到两个地方的J…

科普②| 大数据有什么用?大数据技术的应用领域有哪些?

1、提供个性服务很多人觉得大数据好像离我们很远&#xff0c;其实我们在日常所使用的智能设备&#xff0c;就需要大数据的帮助。比如说我们运动时候戴的运动手表或者是运动手环&#xff0c;就可以在我们平时运动的时候&#xff0c;帮助我们采集运动数据及热量消耗情况。进入睡眠…

类目体系设计总结

一、背景 公司窗帘产品在做分类调整&#xff0c;从原先二级类目调整为三级类目&#xff0c;相对于平台电商我们的类目层次结构要简单很多&#xff08;没有定义商品动态属性等&#xff09;&#xff0c;但对于也有上万款SKU的系统来讲,做好基础的分类对于采购、商品促销、数据报…

消息称三星智能戒指 Galaxy Ring 将延期发布

三星和苹果旗下的智能戒指早有传闻&#xff0c;而最近根据外媒The Elec 报道&#xff0c;三星的智能戒指可能被延期至 2024 年第三季度后发布&#xff0c;这款名为 Galaxy Ring 的智能戒指主要面向健康和 XR 头显市场&#xff0c;可以比 Galaxy Watch 提供更准确的身体及健康数…

Flutter_Slider_SliderTheme_滑杆/滑块_渐变色

调用示例以及效果 SliderTheme(data: SliderTheme.of(context).copyWith(trackHeight: 3,// 滑杆trackShape: const GradientRectSliderTrackShape(radius: 1.5),// 滑块thumbShape: const GradientSliderComponentShape(rectWH: 14, overlayRectSpace: 4, overlayColor: Colou…

网络模型之OSI七层网络模型、TCP/IP四层网络模型

一、计算机网络是什么&#xff1f; 计算机网络是指由通讯网络相互连接的许多自主工作的计算机构成的集合体。 二、网络模型是干什么的&#xff1f; 网络模型就是研究计算机网络中各个部件是以何种规则进行通行。 三、OSI七层网络模型 OSI 是 Open System Interconnection 的…

【Amazon】基于AWS云实例(CentOS 7.9系统)使用kubeadm方式搭建部署Kubernetes集群1.25.4版本

文章目录 前言实验架构介绍K8S集群部署方式说明使用CloudFormation部署EC2实例集群环境准备修改主机名并配置域名解析&#xff08;ALL节点&#xff09;禁用防火墙禁用SELinux加载br_netfilter模块安装ipvs安装 ipset 软件包同步服务器时间关闭swap分区安装Containerd 初始化集群…

40V汽车级P沟道MOSFET SQ4401EY-T1_GE3 工作原理、特性参数、封装形式—节省PCB空间,更可靠

AEC-Q101车规认证是一种基于失效机制的分立半导体应用测试认证规范。它是为了确保在汽车领域使用的分立半导体器件能够在严苛的环境条件下正常运行和长期可靠性而制定的。AEC-Q101认证包括一系列的失效机制和应力测试&#xff0c;以验证器件在高温、湿度、振动等恶劣条件下的可…

97 # session

koa 里的 cookie 用法 koa 里内置了设置 cookie 的方法 npm init -y npm i koa koa/router用法&#xff1a; const Koa require("koa"); const Router require("koa/router"); const crypto require("crypto");const app new Koa(); let …

10_8C++

X-Mind #include <iostream>using namespace std; class Rect { private:int width;int heigjt; public:void init(int w,int h){width w;heigjt h;}void set_w(int w){width w;}void set_h(int h){heigjt h;}void show(){cout << "矩形的周长" <…

【算法练习Day15】平衡二叉树二叉树的所有路径左叶子之和

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 平衡二叉树二叉树的所有路径…

C++并发与多线程(3) | 其他创建线程的方式

1. 用类(可调用对象) 必须要重载括号运算符,否则不是可调用对象。这种方式其实就是一个仿函数。 示例: #include <iostream> #include <thread> using namespace std;class TA { public:void operator() ()// 不能带参数 {cout << "子线程operato…

外汇天眼:一步错步步错,投资者表示真后悔遇到DIFX杀猪盘

随着现在大互联网时代的发展&#xff0c;外汇投资变得越来越普及&#xff0c;因为外汇的特殊性&#xff0c;很多交易都是通过互联网进行的&#xff0c;但面对良莠不齐的外汇平台&#xff0c;投资者若不能对这些平台进行筛选&#xff0c;极易陷入一些黑平台精心设计的诈骗陷阱内…