欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识

采用“标记-清理” CAD加密 算法对老年代进行回收

点击: 次  来源:昆山软开发 时间:2018-01-22

原文出处: 占小狼

什么是CMS

CMS全称 Concurrent Mark Sweep,是一款并发的、利用标志-排除算法的垃圾接纳器,
假如暮年月利用CMS垃圾接纳器,需要添加虚拟机参数-”XX:+UseConcMarkSweepGC”。

利用场景:

GC进程短暂停,适合对时延要求较高的处事,用户线程不答允长时间的搁浅。

缺点:

处事长时间运行,造成严重的内存碎片化。
别的,算法实现较量巨大(假如也算缺点的话)

实现机制

按照GC的触发机制分为:周期性Old GC(被动)和主动Old GC
小我私家领略,实在不知道怎么分才好。

周期性Old GC

周期性Old GC,执行的逻辑也叫Background Collect,对暮年月举办接纳,在GC日志中较量常见,由靠山线程ConcurrentMarkSweepThread轮回判定(默认2s)是否需要触发。

回收“标志-清理” CAD加密 算法对暮年月举办接纳
触发条件

1、假如没有配置-XX:+UseCMSInitiatingOccupancyOnly,虚拟时机按照收集的数据抉择是否触发(发起线上情况带上这个参数,否则会加大问题排查的难度)。
2、暮年月利用率到达阈值 CMSInitiatingOccupancyFraction昆山软件开发,默认92%。
3、永久代的利用率到达阈值 CMSInitiatingPermOccupancyFraction,默认92%,前提是开启 CMSClassUnloadingEnabled
4、新生代的提升包管失败。

提升包管失败

暮年月是否有足够的空间来容纳全部的新生代工具或汗青平均提升到暮年月的工具,假如不足的话,就提早举办一次暮年月的接纳,防备下次举办YGC的时候产生提升失败。

周期性Old GC进程

当条件满意时,回收“标志-清理”算法对暮年月举办接纳,进程可以说很简朴,标志出存活工具,清理掉垃圾工具,可是为了实现整个进程的低延迟,实际算法远远没这么简朴,整个进程分为如下几个部门:

回收“标志-清理” CAD加密 算法对暮年月举办接纳

工具在标志进程中,按照标志环境,分成三类:

  1. 白色工具,暗示自身未被标志;
  2. 灰色工具,暗示自身被标志,但内部引用未被处理惩罚;
  3. 玄色工具,暗示自身被标志,内部引用都被处理惩罚;
回收“标志-清理” CAD加密 算法对暮年月举办接纳

假设产生Background Collect时,Java堆的工具漫衍如下:

回收“标志-清理” CAD加密 算法对暮年月举办接纳
1、InitialMarking(初始化标志,整个进程STW)

该阶段单线程执行,主要分分为两步:

  1. 标志GC Roots可达的暮年月工具;
  2. 遍历新生代工具,标志可达的暮年月工具;

该进程竣事后,工具漫衍如下:

回收“标志-清理” CAD加密 算法对暮年月举办接纳
2、Marking(并发标志)

该阶段GC线程和应用线程并发执行,遍历InitialMarking阶段标志出来的存活工具,然后继承递归标志这些工具可达的工具。

因为该阶段并发执行的,在运行期间大概产生新生代的工具提升到暮年月、可能是直接在暮年月分派工具、可能更新暮年月工具的引用干系等等,对付这些工具,都是需要举办从头标志的,不然有些工具就会被漏掉,产生漏标的环境。

为了提高从头标志的效率,该阶段会把上述工具地址的Card标识为Dirty,后续只需扫描这些Dirty Card的工具,制止扫描整个暮年月。

回收“标志-清理” CAD加密 算法对暮年月举办接纳
3、Precleaning(预清理)