龙空技术网

JVM调优:垃圾收集器(三)

日拱一卒程序猿 34

前言:

而今兄弟们对“java浮动垃圾”大概比较重视,兄弟们都想要分析一些“java浮动垃圾”的相关资讯。那么小编同时在网摘上网罗了一些对于“java浮动垃圾””的相关知识,希望小伙伴们能喜欢,各位老铁们快快来了解一下吧!

一、 CMS垃圾回收器

CMS垃圾回收器 CMS(concurrent mark sweep)是以获取最短垃圾收集停顿时间为目标的收集器,CMS收集器的关注点尽可能缩短 垃圾收集时用户线程的停顿时间,停顿时间越短就越适合与用户交互的程序,目前很大一部分的java应用几种在互联网 的B/S系统服务器上,这类应用尤其注重服务器的响应速度,系统停顿时间最短,给用户带来良好的体验,CMS收 集器使用的算法是标记-清除算法实现的;

二、CMS垃圾收集过程

整个过程分4个步骤:

1)初始标记

2) 并发标记

3) 重新标记

4) 并发清除

其中 初始标记 和 重新标记 都需要stopTheWorld

CMS整个过程比之前的收集器要复杂,整个过程分为4个阶段即、初始标记 并发标记 、重新标记、并发清除

初始标记(Initial-Mark)阶段:这个阶段程序所有的工作线程都将会因为"Stop-the-Wold"机制而出现短暂的的 暂停,这个阶段的主要任务标记处GC Roots 能够关联到的对象.一旦标记完成后就恢复之前被暂停的的所有应 用。 由于直接关联对象比较小,所以这里的操作速度非常快。 并发标记(Concurrent-Mark)阶段:从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较 长,但是不需要暂停用户线程, 用户线程可以与垃圾回收器一起运行。 重新标记(Remark)阶段:由于并发标记阶段,程序的工作线程会和垃圾收集线程同时运行或者交叉运行, 因此,为了修正并发标记期间因为用户继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段 的停顿时间通常比初始标记阶段长一些,但也远比并发标记阶段时间短。 清除并发(Concurrent-Sweep)阶段: 此阶段清理删除掉标记判断已经死亡的对象,并释放内存空间。由于不需 要移动存活对象,所以这个阶段可以与用户线程同时并发运行。

由于最消耗事件的并发标记与并发清除阶段都不需要暂停工作,因为整个回收阶段是低停顿(低延迟)的。

三、并发可达性分析

当前主流编程语言的垃圾收集器基本上都是依靠可达性分析算法来判定对象 是否存活的, 可达性分析算法理论上 要求全过程都基于一个能保障一致性的快照中才能够进行分析。 垃圾回收器的工作流程大体如下:

1. 标记出哪些对象是存活的,哪些是垃圾(可回收);

2. 进行回收(清除/复制/整理),如果有移动过对象(复制/整理),还需要更新引用。

四、CMS收集器三个缺点

1.CMS收集器对CPU资源非常敏感。

2.CMS收集器无法处理浮动垃圾,可能出现"Concurrent Mode Failure"失败而导致另一次Full GC的产生。

3.空间碎片:CMS是一款基于标记-清除算法实现的收集器,所有会有空间碎片的现象。

标签: #java浮动垃圾