前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CMS和G1

CMS和G1

作者头像
你的益达
发布2020-08-05 11:59:46
发布2020-08-05 11:59:46
9210
举报

CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以最短响应时间为目标的垃圾收集器。

如其名字其使用的回收算法为标记-清除算法,并且作用于老年代,其收集步骤包括以下四步:

1)、初始标记:标记与GCRoots直接相连的对象,该过程需要stop the world(单线程)

2)、并发标记:标记线程和用户线程一起工作,遍历整个对象图

3)、重新标记:该过程是为了修正并发标记中标记变动的那部分对象

4)、并发清理:清理线程同用户线程一起工作

CMS算法的三个缺点:

1)、对处理机资源敏感,由于标记/清理阶段用户线程是与gc线程一起工作的,对于cpu核心数量较少的处理机例如只有两核的,此时由于gc线程的存在,直接降低了一半的处理能力。

2)、可能会出现Conncurrent Mode Failure的问题,导致一次full gc,由于并发标记/并发清理阶段,gc线程和工作线程一起执行,因此CMS过程中会产生浮动垃圾,因此CMS不能像其他老年代收集器那样等老年代填满了再收集,必须留有一定的空闲用于存储CMS执行期间产生的新的对象。因此CMS运行期间若预留的空间不足以分配对象,则会出现并发失败的情况,如此不得已只能使用serial Old收集器了。

3)、标记整理算法固有的问题,内存碎片。

G1收集器

Garbage First收集器,首次提出了局部收集的设计思路和基于Region的内存布局。

对于G1来说,其每次收集的区域不再是整个年轻代、老年代或者整个堆。其可以将堆内存中的任何区域组成回收集进行回收,其用于用于衡量是否需要收集的标准不再是年轻代、老年代而是哪个内存中存放的垃圾最多,回收收益最大。

此外其将堆内存区域分成一个个Region,每个Rigion的功能不固定,可以根据需要作为Eden空间、survivor空间以及老年代空间。收集时以一个Region为最小单元,如此可以避免整个堆的进行垃圾回收。

之前提到的每次回收价值最大的区域,该“价值”指的是通过回收可获得的空间以及回收所需的时间(这里的时间是经验者),具体操作为在后台维护一个优先级列表,每次根据用户设定的允许的收集停顿时间(-XX:MaxGCpauseMillis)回收那些价值最大的region。

其收集步骤如下:

1)、初始标记:标记与GCRoots直接相连的对象(单线程)

2)、并发标记:标记线程和用户线程一起工作,遍历整个对象图

3)、重新标记:处理并发标记出现在STAB(Snapshot At the Begin)中的记录(只有gc线程需要STW)

4)、筛选回收:选择价值最高的这部分Region(需要考虑用户设定的停顿时间),将这部分中Region中活的对象复制到空的Region中,再清理到旧的Region空间。

CMS和G1的比较

G1替换掉CMS已经成为不可逆转的趋势,下面就G1为何比CMS优秀加以说明:

1)G1基于Region的局部回收避免了全堆进行垃圾回收,再加上其按照动态受益确定回收集极大的提升了回收效率。

2)G1总体上采用的是标记-整理算法,局部(region之间)采用的是标记-复制算法,与CMS的标记-清除算法相比,其不会产生内存碎片。

G1也存在他的缺点:

G1的卡表所占的空间巨大,由于每个Region都要拥有一张卡表,如此导致记忆集要占20%左右的堆空间,而CMS中只需要维护老年代指向新生代的一张卡表即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CMS收集器
  • G1收集器
    • CMS和G1的比较
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档