zoukankan      html  css  js  c++  java
  • G1和CMS的区别

    CMS和G1垃圾回收流程区别

    CMS流程

    —>初始标记(只标记最根上的对象STW)>并发标记(百分之八十时间)
    
    >重新标记(STW 并发标记过程中错标 重新标记) CMS和G1采用的三色标记,区别是CMS增量更新,G1采用的快照替换
    >并发清理(这个过程产生的垃圾叫浮动垃圾 只能等下一次CMS)

    其中初始标记和重新标记会STW。

    ps:并发清理时因为有浮动垃圾的存在,所以CMS不能等老年代全满了才回收(回从年轻代过来浮动垃圾)

    有一个参数in ni shou 哦 可 pan ci:老年代达到总空间多少的时候开始启动回收进程。

    有个版本是90% 如果业务负责,会很快填充到百分百,此时老年代满了之后 最夸张的是会用s o单线程回收。

    G1:引入了分区,物理上分区,逻辑上分代

    分区回收:哪个区快满了,可以动态的清掉

    优先回收:花费时间少 垃圾比例高的Region(区)

    每个区清空之后可以根据需要动态的指定为 伊甸区 老年代 

    G1垃圾回收器 新生代 survivor区edon区,老年代,等代的占比会自己动态的调整

    CMS和G1三色标记算法区别

    先看看什么是三色标记

    三色标记应用于并发标记的场景:对象树中哪个标过了 哪个没有标 ,下一次回来,必须从现有的状态继续走。

    黑:对象树中 自己和子节点全部都标记过了

    灰:自己标记过 子节点没完全标记过

    白:自己没标记过

    三色标记会出现漏标的问题

    如果垃圾回收线程此时扫描对象树的状态是:A-B-D

    等业务线程执行一断时间后 此时 A指向了DB, BD断开。 此时D不是垃圾,但是垃圾回收器以为D是垃圾(因为BD断开,垃圾回收器不扫黑色A)

    如图:

    CMS解决方案

    业务线程A指向D的时候把A变成灰色(通过写屏障),但在两个垃圾回收线程并发标记的时候这个算法有个bug

      m1垃圾回收正在标记A,已经标记完成属性1 正在标记属性2

      m2业务线程把A属性1指向白色对象D

      m3垃圾回收线程把A标记成灰色

           m1垃圾回收把属性2标记完成,把A标记成黑色,结果D还是会漏标。

    所以CMS在remark阶段 会从头扫一遍以解决这个问题(STW)

    G1解决方案

    SATB,把灰色对象指向白色对象引用消失的时候,把这个引用放到一个堆栈里面。

    当垃圾回收线程回来的时候,检查一个堆栈(有没有 灰色指向白色引用消失的过程),找到D之后把D变成灰色即可

  • 相关阅读:
    APP 弱网测试可能会出现的bug
    Monkey 稳定性测试
    设计模式 策略模式
    设计模式 单例模式
    Linux常用命令(三)文件权限管理
    Linux常用命令(二)文件目录管理命令
    Linux常用命令(一)
    WSL安装yum报错:E: Unable to locate package yum
    使用LxRunOffline迁移WSL
    关于PyQt5 setPalette 设置背景不生效问题
  • 原文地址:https://www.cnblogs.com/ssskkk/p/15536597.html
Copyright © 2011-2022 走看看