2.2GC系列-------如何进行回收(具体实现)

本篇针对第二个问题:如何对垃圾进行回收-具体实现

image.png
  • 前置知识

    • safepoint:安全点
      简单理解:就是JVM当前正在运行的线程状态可以确定的一个时刻,睡眠或阻塞的线程在这一个安全区域(Safe Region)中(引用关系不会发生变化了)。如此,才能确定oopMap-》然后确定GC Roots,最终才可以发起GC。
    • stop the world:所有线程暂停下来,不再运行,引用关系也就不会发生变化了,所以能进行GC。如果GC过程中,引用关系还在变化,这样的GC肯定是不准确的,会严重影响到系统的正确执行。
  • 垃圾收集器

    • serial收集器:单线程收集。JVM团队的目标就是不断缩减停顿时间。对于单CPU应用,这是很棒的,单线程下工作效率很高,适用于Client模式。


      image.png
  • ParNew收集器:多线程收集(用户线程依然不可以继续执行)。除了是多线程收集之后,其余都和serial收集器一样。在单CPU情况下,serial肯定是可以秒杀ParNew收集器的,但是在多CPU的情况下,多线程就会显得效率更高了。ParNew适合用在server模式下。注意:在和老年代收集器CMS配合使用下,只有ParNew和Serial可以与其配合使用。

image.png
  • Parallel Scavenge收集器:"多线程收集器"、"吞吐量优先收集器",与用户交互的程序是更关注停顿时间的,但是像计算任务却是更关注吞吐率(运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间) )。
    参数: MaxGCPauseMills:尽可能的控制GC时间小于这个值,不过会影响到吞吐率和GC频率。
    GCTimeRatio:如果设置为19,则垃圾收集占的比例就是1/(1+19) = 5%
    自适应调节参数UseUseAdapiveSizePolicy:将这个开关参数打开,JVM就会根据系统运行情况分配新生代三区配比

  • Serial Old收集器:"单线程收集器"、"老年代收集器"。适用场景:1.适用于Client模式下 2.作为CMS收集发生Concurrent Mode Failue的时候作为预案使用。


    image.png
  • Parallel Old收集器:"多线程收集器"、"吞吐量优先收集器"、"新生代老年代唯一适配的黄金搭档"。和Parallel Scavenge配合使用作为吞吐量优先收集器的最佳方案。在此之前,因为Parallel Scavenge收集器只能和Serial Old收集器配合使用,但Serial在server模式下无法发挥出多CPU的优势,而成为性能瓶颈。


    image.png

!!!!!!CMS收集器

  • CMS收集器:"并行收集器"、"标记-清除算法"。追求停顿时间短短短!可以与用户线程并行的工作。根据图片我们可以知道,CMS收集器工作分为四个阶段。

    初始标记:Stop The World。简单标记一下GC Roots能引用到的对象。时间很短。
    并发标记:并行。完整的进行标记,与用户线程同时工作。
    重新标记:Stop The World。修正并发标记阶段发生引用变化那部分对象的记录。远比并发标记时间短,比初始标记长。
    并发清理:内存回收。无法清理浮动垃圾(因为内存清理的时候用户线程还在运行,所以还会产生垃圾)。

    CMS收集器会产生的问题:
    问题1:对CPU资源敏感。CMS默认启动的垃圾收集线程数:(CPU数量+3)/4,可想而知,当CPU数量=4的时候,就要一个垃圾收集线程,占了25%的CPU资源。不过当CPU数量越多的时候,占用比例就不明显了。
    问题2:"Concurrent Mode Failure"问题,设置老年代触发垃圾收集比例,当老年代触发垃圾收集比例设置的过高的时候就可能导致在垃圾收集的时候用户线程没有足够的内存空间来运行,就会出现"Concurrent Mode Failure"失败,JVM将使用serial old收集器来进行老年代的回收。
    问题3:"标记-清除"算法的缺点,产生大量内存碎片。JVM给了我们两个选择,一是设置一个参数当进行多少次GC的时候就进行一次带压缩的Full GC,二是设置一个在要进行Full gc的时候先来一次内存整理。
    问题4:就是上述所说的浮动垃圾的清理问题,只能留待下一次GC的时候清理。


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

推荐阅读更多精彩内容