JVM中从JDK 4正式引入并发回收,用于解决垃圾回收过程中停顿时间过长的问题。JVM的垃圾回收器通常采用分代设计,新生代和老生代采用不同的垃圾回收算法,在并发垃圾回收器中,新生代采用并行的复制算法,老生代采用并发的标记清除算法。狭义上所说的并发回收(Concurrent-Mark-Sweep,CMS)仅仅指针对老生代的回收,而广义上所说的并发垃圾回收指的是新生代采用并行复制算法、老生代采用并发标记清除算法。本书使用广义上的概念。
到目前为止,CMS仍然是最成功的垃圾回收器,满足了大多数业务场景的需要。一方面,其本身存在设计上的特点,存在停顿时间偶发过长的情况、停顿时间不可控等问题。另外一方面,CMS在实现时为了能更好地满足停顿时间的需要,将并发粒度设计得非常细,例如老生代垃圾回收的某些阶段可以和Mutator并发运行,老生代垃圾回收可以和新生代垃圾回收并发运行,新生代垃圾回收还可以抢占老生代垃圾回收等,细粒度的并发设计会导致CMS实现的复杂性,所以CMS也是bug最多的垃圾回收器之一,在使用时存在崩溃的情况。基于以上原因,JVM引入了Garbage First的垃圾回收器用于替代CMS,从JDK 11开始,正式不推荐使用CMS,在JDK 14中CMS正式被移除。
鉴于目前生产环境中仍然以JDK 8为主,同时广大的程序员仍然使用CMS,另外,大家遇到的如V8(JavaScript虚拟机)、ART(Android Runtime)等其他虚拟机中的垃圾回收也都有并发标记清除的垃圾回收器实现,所以本章还是对CMS进行详细介绍。