什么是CMS
CMS全称 Concurrent Mark Sweep
,是一款并发的、利用标志-排除算法的垃圾接纳器,
假如暮年月利用CMS垃圾接纳器,需要添加虚拟机参数-”XX:+UseConcMarkSweepGC”。
GC进程短暂停,适合对时延要求较高的处事,用户线程不答允长时间的搁浅。
处事长时间运行,造成严重的内存碎片化。
别的,算法实现较量巨大(假如也算缺点的话)
按照GC的触发机制分为:周期性Old GC(被动)和主动Old GC
小我私家领略,实在不知道怎么分才好。
周期性Old GC,执行的逻辑也叫Background Collect
,对暮年月举办接纳,在GC日志中较量常见,由靠山线程ConcurrentMarkSweepThread轮回判定(默认2s)是否需要触发。
1、假如没有配置-XX:+UseCMSInitiatingOccupancyOnly,虚拟时机按照收集的数据抉择是否触发(发起线上情况带上这个参数,否则会加大问题排查的难度)。
2、暮年月利用率到达阈值 CMSInitiatingOccupancyFraction
,昆山软件开发,默认92%。
3、永久代的利用率到达阈值 CMSInitiatingPermOccupancyFraction
,默认92%,前提是开启 CMSClassUnloadingEnabled
。
4、新生代的提升包管失败。
暮年月是否有足够的空间来容纳全部的新生代工具或汗青平均提升到暮年月的工具,假如不足的话,就提早举办一次暮年月的接纳,防备下次举办YGC的时候产生提升失败。
当条件满意时,回收“标志-清理”算法对暮年月举办接纳,进程可以说很简朴,标志出存活工具,清理掉垃圾工具,可是为了实现整个进程的低延迟,实际算法远远没这么简朴,整个进程分为如下几个部门:
工具在标志进程中,按照标志环境,分成三类:
假设产生Background Collect时,Java堆的工具漫衍如下:
该阶段单线程执行,主要分分为两步:
该进程竣事后,工具漫衍如下:
该阶段GC线程和应用线程并发执行,遍历InitialMarking阶段标志出来的存活工具,然后继承递归标志这些工具可达的工具。
因为该阶段并发执行的,在运行期间大概产生新生代的工具提升到暮年月、可能是直接在暮年月分派工具、可能更新暮年月工具的引用干系等等,对付这些工具,都是需要举办从头标志的,不然有些工具就会被漏掉,产生漏标的环境。
为了提高从头标志的效率,该阶段会把上述工具地址的Card标识为Dirty,后续只需扫描这些Dirty Card的工具,制止扫描整个暮年月。