垃圾收集器之-cms/G1 深入分析比较

        CMS 一款具有时代意义的收集器,它是第一款可以与用户线程并行进行行的执行收集器,CMS 主要用于对年老代区域的堆进行垃圾回收,采用的是标记清除算法,标记清除收集效率高,但致命的缺陷就是产生内存碎片,当年老代的可用区域不足8%会触发其老年代的垃圾回收,由老年代需要 分配出一定比例的内存用于对新生代的分配担保 所以会在达到92%时进行垃圾回收。

       与CMS 搭配使用的新生代的收集器 为ParNew 是一款多线程并发的收集器

       G1 收集器是采用化整为零的方式将 内存区域划分成一个个的 Region 区域不同的区域有不同的分代划分类型,可以分为4中类型 E/S/O/H,四种类型 E 标识 Eden ,S survivor , O Old ,H 大对象分配区域

      G1 整体采用的标记整理,局部采用的是复制算法,当某个区域的对象经过GC后 绝大多数存活的情况下只需修改一下,区域的分代标识即可,不用挪动对象,而且会通过算法计算每次回收的成本和收益,如果用户配置了停顿时间,G1会尽力将停顿时间控制在指定时间内,通过回收收益最大的区域来满足用户需求。

     CMS 回收  初始标记[stw] -> 并发标记{用户线程} -> 最终标记[针对漏对象][stw] -> 并发清除

     G1    回收  初始标记[stw] -> 并发标记{用户线程} -> 重新标记 -> 筛选回收

三色标记回收方法:从根GCroots开始扫描

     (1) 如果当前节点以及其所有的子几点都已经被扫描标记则将当前节点标记为黑色

     (2) 如果当前节点被扫描其子节点尚未被扫描完成则将其标记为 灰色

     (3) 剩余的就是 白色 垃圾节点待回收

     初始标记扫描标记GcRoots 对象,以及 和GCRoots 直接相连的对象 期间会暂停用户线程,并发标记 会与用户线程并发的执行,如果有漏标的,并发执行期间

     (1) CMS 引用关系发生变化也会在重新标记进行重新增量的扫描(从变化节点的根节点重新扫描一遍) increment and update

     (2) G1 采用的是 Snapshot 快照的方式对比发生变化的引用做响应的修改 STAB(JDK9默认G1 > 6G的堆)

       跨代引用,当要对老年代持有对新生代的引用时,新生代回收时 年老代的对象就是 GcRoot, 这就表名新生代的对象是不能被回收,但是这就有问题了,新生代是如果需要确定是否存在跨带引用,就需要对整个年老代进行扫描,而年老代的扫描效率是很低的,年老代中的对象是很大的。

      JVM 引入了记忆集 ReSet 和 CardTable 卡表,存储在新生代中 记忆集中存储的是 引用 和 所在卡表的位置,卡表将老年代划分成 2的指数次幂大小的区域,每个卡表项 记录每个区域的地址的起始地址 十六进制数,这样当新生代回收时如果存在跨代引用的对象,则根据记忆集,扫描对应区域的年老代的对象即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值