CMS垃圾收集器和G1垃圾收集器_cms和g1收集器-程序员宅基地

技术标签: 经验分享  java  程序人生  

CMS

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的老年代收集器。CMS收集器与之前的垃圾收集器最大的特点就是它可以并发清除垃圾。
他的工作流程如下:

  1. 初始标记(CMS initial mark)
  2. 并发标记(CMS concurrent mark)
  3. 重新标记(CMS remark)
  4. 并发清除(CMS concurrent sweep)
  • 其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GCRoots能直接关联到的对象,速度很快;
  • 并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行;
  • 而重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录(增量更新),这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短;
  • 最后是并发清除阶段,清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。由于在整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

因为CMS垃圾收集器要求低延迟,在清理垃圾的时候要做到并发。所以它采用的是标记-清除算法。 这种算法必然回导致产生大量的空间碎片
这是他的一个缺点。
他还有两个缺点就是:

  • 对处理器资源非常敏感。
  • 无法处理浮动垃圾。

Garbage First(G1)收集器

Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。
特点:

  • 全功能的垃圾收集器(老年代新生代都可使用)
  • 把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。
  • 垃圾收集的目标范围并不像其他垃圾收集器一样要么是整个新生代(Minor GC),要么就是整个老年代(Major GC),再要么就是整个Java堆(Full GC)。它可以面向堆内存任何部分来组成回收集(Collection Set,一般简称CSet)进行回收,衡量标准不再是它属于哪个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大,这就是G1收集器的Mixed GC模式。
  • 能够支持指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间大概率不超过N毫秒这样的目标。
  • 让G1收集器去跟踪各个Region里面的垃圾堆积的“价值”大小,价值即回收所获得的空间大小以及回收所需时间的经验值,然后在后台维护一个优先级列表,每次根据用户设定允许的收集停顿时间(使用参数-XXMaxGCPauseMillis指定,默认值是200毫秒),优先处理回收价值收益最大的那些Region。
  • 整体用的标记-整理算法,每个region间用的标记-清除算法。
  • 它的每个Region都维护有自己的记忆集,来解决跨代引用。
  • 而对于那些超过了整个Region容量的超级大对象,将会被存放在N个连续的Humongous Region之中,G1的大多数行为都把Humongous Region作为老年代的一部分来进行看待

工作流程如下:

  • 初始标记(Initial Marking):仅仅只是标记一下GC Roots能直接关联到的对象,并且修改TAMS指针的值,让下一阶段用户线程并发运行时,能正确地在可用的Region中分配新对象。这个阶段需要停顿线程,但耗时很短,而且是借用进行Minor GC的时候同步完成的,所以G1收集器在这个阶段实际并没有额外的停顿。
  • 并发标记(Concurrent Marking):从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。当对象图扫描完成以后,还要重新处理SATB记录下的在并发时有引用变动的对象。
  • 最终标记(Final Marking):对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那少量的SATB记录。(原始快照)
  • 筛选回收(Live Data Counting and Evacuation):负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧Region的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的。

G1收集器除了并发标记外,其余阶段也是要完全暂停用户线程的。包括筛选回收。G1不是仅仅面向低延迟,停顿用户线程能够最大幅度提高垃圾收集效率,为了保证吞吐量所以才选择了完全暂停用户线程的实现方案。
吞吐量 = 执行用户线程的时间/(执行用户线程时间 + 执行gc线程时间)。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_54494937/article/details/122600431

智能推荐

安装Nodejs踩过的坑:npm安装报错npm ERR code EPERM npm ERR syscall mkdir npm ERR path DProgram Filesnod..)_>npm init vue@latest npm err! code eperm npm err! -程序员宅基地

文章浏览阅读870次,点赞3次,收藏5次。今天学vue到webpack,大无语了家人们,从第一步npm installl的安装开始,就逐渐陷入了npm的坑!首先,从官网下载node.js,链接Download | Node.js,根据自己的电脑配置选择安装版本(推荐LST稳定版本的),然后按照安装步骤操作就行,直到测试安装的时候,开始报错了:网上查找了许多博文之后找到了解决方法:1、删除C:Users用户下的.npmrc文件这里我的.npmrc是正常显示的,如果你的没有,看是不是因为将隐藏的项目勾选上了,然后去掉勾选。2、在命令行输入_>npm init vue@latest npm err! code eperm npm err! syscall open npm err! path

Java8流式操作-根据集合的某个属性值取交集,差集_java 根据某个属性判断两个集合中的差集-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏19次。这里是使用一个自定义类的集合和一个Integer类的集合做的一次栗子,两个封装类的操作,或者两个基本类型的集合操作都是类似的。public class CollectionTest { public static void main(String[] args) { List<Customer> list = new ArrayList<>(); Customer customer = new Customer(); cus_java 根据某个属性判断两个集合中的差集

JQuery:ajax后台返回list,前台用jquery遍历list-程序员宅基地

文章浏览阅读68次。JQuery:ajax后台返回list,前台用jquery遍历list

打造健康产业新业态 中国抗衰老促进会康养产业分会成立-程序员宅基地

文章浏览阅读516次。6月23日,中国抗衰老促进会康养产业分会成立大会在京举行。原国家卫生部副部长孙隆椿、原总后卫生部部长李深、中国抗衰老促进会法人理事长刘仁富,副理事长朱怡霖、北京师范大学系..._中国抗衰老促进会证书含金量

How to use JFlash_jflash checksum-程序员宅基地

文章浏览阅读360次。 There is a problem happen when download firmware to the LPC2214 with JFlash v3.42b, the unit will not be turned on when power is on. But the download will be ok when I use JFlash v4.02 and v4.08, t_jflash checksum

Unity Texture2D的可读性问题_argumentexception: texture2d.getpixels: texture da-程序员宅基地

文章浏览阅读4.1k次。今天测试使用UMP播放网络摄像头的数据。处理截图的时候发现,显示摄像头图像的RawImage里面的图片保存不出来。研究了很久才发现这个时候里面的texture数据应该是不可读,所以直接使用EncodeToJPG()函数没有用。需要把这个Texture2D的数据转成可读的,方法如下// 复制出可读的Texture2D private Texture2D CopyT2DToWrite(Texture2D source) { // 先把Texture2D转成临时的_argumentexception: texture2d.getpixels: texture data is either not readable,

随便推点

Unity根据多点画一条平滑曲线(贝塞尔曲线)_unity 多点连线-程序员宅基地

文章浏览阅读2.3k次。因最近需要对多个无规则的点规划出一条圆滑曲线,现找到的方法是使用贝塞尔曲线进行规划。在此,先简单了解了一下贝塞尔曲线的知识,具体知识转至:http://www.cnblogs.com/jay-dong/archive/2012/09/26/2704188.html最后选择使用三阶贝塞尔曲线:特此,感谢博主木落潇潇博文的支持。从图中可以看出,只有四个点是保持不变的,分别是P0,P1,P2,P3,这四个点两两相连得到三个线段(1)在上四点构成的三个线段中,p0-p1上有到一个点,p1-p2上有到一个_unity 多点连线

C语言求1000以内的所有素数(厄拉多塞筛选法与一般算法的比较)_求1000以内的素数-程序员宅基地

文章浏览阅读6.3k次,点赞8次,收藏13次。C语言求1000以内的所有素数第一次写博客,啥也不说了_求1000以内的素数

链游平台 Attarius Network 加入章鱼网络成为候选应用链_区块链公司attarius network-程序员宅基地

文章浏览阅读2.2k次。全长5258字,预计阅读 15分钟撰文:MiX 微信交流:mixoct链游平台 Attarius Network ,将作为候选应用链加入章鱼网络的多链网络生态。Attarius Network 为链游开发者和游戏玩家提供完整一体化的生态系统,用于集成、创建和管理游戏以及游戏资产,能够帮助链游团队构建更好的 GameFi 机制和游戏资产 NFT 化能力。我们相信2022年将会是围绕跨链、可互操作性和高效解决方案的一年,Attarius 非常高兴能与章鱼网络达成合作,构建游戏一体化生态系统._区块链公司attarius network

HikariCP常用监控指标与故障排查实战-程序员宅基地

文章浏览阅读5.9k次,点赞6次,收藏7次。编者有言:本书由资深数据库连接池专家撰写,褚霸、德哥、张亮、吴晟等近10位专家高度评价,从设计思想、功能使用、原理实现、工程实践、技术扩展5个维度对HikariCP进行全面讲解和深入分析..._hikaricp 重连次数

mysql选择上一条、下一条数据记录,排序上移、下移、置顶_mysql上一条下一条功能实现-程序员宅基地

文章浏览阅读6.7k次。选择mysql记录上一条,下一条sql语句,完成列表排序上移,下移,置顶功能!设置一个rank为之间戳,通过选择上移,就是将本记录与上一条记录rank值交换,下移就是将本条记录与下一条记录rank值交换,置顶就是将本记录与rank值最小的记录交换_mysql上一条下一条功能实现

在本地浏览器上查看远程服务器上的tensorboard_访问tensorboard的url post-程序员宅基地

文章浏览阅读673次,点赞2次,收藏4次。1. keras中生成tensorboard日志信息 由于tensorboard日志是记录并且可视化训练过程的各个指标和权重信息的,所以需要通过回调函数来实现训练过程中的记录,然后将相应的回调函数传给模型的fit方法即可。如下所示,tf.keras.callbacks中有现成的回调函数,然后将其传给fit方法的callback参数即可。训练完成后就会在logdir目录下生成相应的信息文件。log_dir = "logs/fit/" + datetime.datetime.n..._访问tensorboard的url post

推荐文章

热门文章

相关标签