邯郸网站制作个人你就知道
一、简述
在JDK 1.5时期,Hotspot推出了一款在强交互应用中几乎可认为有划时代意义的垃圾收集器:CMS (Concurrent-Mark-Sweep)收集器,这款收集器是HotSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程同时工作。
CMS收集器的关注点是尽可能缩短垃圾收集时用户线程的停顿时间。停顿时间越短(低延迟)就越适合与用户交互的程序,良好的响应速度能提升用户体验。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。
二、收集步骤
-
Phase1 :Initial Mark【初始标记】
-
此阶段会暂停所有的其他线程(即“Stop-the-World”,简称STW),标记GC Roots直接关联的对象,速度很快,通常能很快完成
-
Phase2 : Concurrent Mark 【并发标记】
-
此阶段会与用户线程并发执行,进行GC Roots Tracing,标记所有可达的对象。这是整个过程中耗时最长的阶段,但因为是并发的,所以对系统性能影响较小。
-
Phase3 : Concurrent Preclean【并发预先清除】
-
这个阶段GC线程和应用线程也是并发执行,因为阶段2是与应用线程并发执行,可能有些引用关系已经发生改变。 通过卡片标记(Card Marking),提前把老年代空间逻辑划分为相等大小的区域(Card),如果引用关系发生改变,JVM会将发生改变的区域标记位“脏区”(Dirty Card),然后在本阶段,这些脏区会被找出来,刷新引用关系,清除“脏区”标记。
-
Phase4 : Concurrent Abortable Preclean【并发可能失败的预先清除】
-
这个阶段也不停止应用线程. 本阶段尝试在 STW 的 最终标记阶段(Final Remark)之前尽可能地多做一些工作,以减少应用暂停时间 在该阶段不断循环处理:标记老年代的可达对象、扫描处理Dirty Card区域中的对象,循环的终止条件有: 1 达到循环次数 2 达到循环执行时间阈值 3 新生代内存使用率达到阈值。这个阶段最大持续时间(条件2)为5秒,之所以可以持续5秒,有个原因也是为了期待这5秒内能够发生一次young gc,清理年轻带的引用,减少下个阶段的重新标记阶段扫描年轻带指向老年代的引用的时间。
-
Phase5 : Final Remark【最终重新标记】
-
由于并发标