CMS垃圾收集器

CMS介绍

CMS全称Concurrent Mark Sweep,从名字可知是基于“标记——清除”算法实现。以获取最短回收停顿时间为目标;


CMS垃圾收集器.png

总的来说,由上图可知CMS垃圾回收有四个步骤:

  • 初始标记(Initial Mark)
    标记GC Roots能直接关联到的对象,速度很快。
  • 并发标记(concurrent mark)
    遍历初始标记阶段标记出来的存活对象,然后继续递归标记这些对象可达的对象
  • 重新标记(remark)
    修正由于并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录
  • 并发清理(concurrent sweep)
    与用户线程一起运行,清理那些无效的对象。

其中初始标记和重新标记需要Stop The World,但时间很短。并发标记与并发清理需要时间较长,但是可以和用户线程并发执行。

CMS缺点:

  • 无法处理浮动垃圾而导致concurrent mode failure

浮动垃圾:由于CMS并发清理阶段,用户线程的运行会导致新的垃圾产生,但是这一部分垃圾出现在标记阶段之后,CMS无法在当次收集中处理,只能在下次GC中清理,这一部分垃圾就称为“浮动垃圾”。

所以说CMS需要在老年代预留部分空间供并发收集时的程序运作使用。那么问题来了,CMS什么时候开始工作呢?也就是说CMS在老年代在使用百分之多少的空间时激活呢。太小不行,使用内存空间会小,这样垃圾容易满,GC次数会变多。

在JDK1.6中,阈值为92%(通过-XX:CMSInitiatingOccupancyFraction=)设置,预留的8%空间如果无法满足程序需要,就会出现concurrent mode failure。

这时JVM就会启用Serial Old收集器重新进行单线程STOP The World垃圾收集。效率极具下降。

  • 基于“标记——清除”算法会产生内存碎片,进而导致promotion failure

这是一个剩余空间不够的问题,剩余空间不够不是说整体的空间不够分配某个对象,而是说连续的空间不够分配给某个对象。所以一旦内存碎片大多就可能发生剩余空间不够的问题。(-XX:UseCMSCompactAtFullCollection和-XX:CMSFullGCBeforeCompaction=0 配合使用可以设置每次进行Full GC都开启碎片整理,不过这两个默认就是开启的,实际不需要设置)

promotion failure:minor gc过程中,另一个survivor的剩余空间不足以容纳eden及当前在用survivor区间存活对象,只能将容纳不下的对象移到年老代(promotion),而此时年老代由于剩余空间不够,无法容纳更多对象,通常伴随full gc,因而导致的promotion failure

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

  • CMS是老年代垃圾收集器,在收集过程中可以与用户线程并发操作。它可以与Serial收集器和Parallel New...
    zhong0316阅读 40,656评论 2 27
  • 本文转载一篇Blog,讲述了CMS promotion failed和concurrent mode failur...
    一帅阅读 1,786评论 0 2
  • Java和C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进来,墙里面的人想出来。 对象...
    胡二囧阅读 1,085评论 0 4
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,661评论 0 7
  • 气象中心昨天就发布了台风预报 室外作业的一支施工队今日停工,我们继续 今天的朋友圈关键词是疫苗 饭后坐院子里蹭凉,...
    禾伤阅读 280评论 0 0