JVM/GC/CMS
CMS (Concurrent Mark Sweep)
- jdk1.4后期版本开始引入的新gc算法
- ParNew(新生代) + CMS(老年代)组合使用
- 使用标记-清除算法
- 目标:适合于B/S等对响应时间要求高的场景
- 缺点:运行结束产生大量空间碎片
- 缺点:由于分配给用户使用的老年代空间不足造成可能出现“Concurrent Mode Failure”
流程
CMS使用标记-清除算法
- 初始标记(STW)
- 预先清除
- 最终标记(STW)
- 并发清除
Concurrent Mode Failure
- 问题:并发清除阶段应用线程和GC线程是同时运行的,也就是对象的分配和对象的清除是同时运行的。如果,分配给应用线程使用的老年代空间不足就会出现“并发模式错误”Concurrent Mode Failure。
- GC:“并发模式错误”将引起一次Full GC,调用Serial Old收集器重新对老年代进行垃圾回收,此时的停顿时间将明显延长。
- 解决:Concurrent Mode Failure可以通过减少"CMS初始占用内存比例"
-XX:CMSInitiatingOccupancyFraction
参数,以扩大应用线程可用老年代内存空间比例,进而降低出现“并发模式错误”Concurrent Mode Failure的概率。