Java 面试题
目录

Java 虚拟机 (JVM) 中 CMS 收集器的特点是什么?

· 约 3 分钟读完 · 第 133 / 274 章

推荐答案

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的垃圾收集器。它主要适用于对响应时间要求较高的应用场景,如Web服务器、数据库服务器等。CMS收集器的特点如下:

  1. 并发收集:CMS收集器的大部分工作是与应用程序线程并发执行的,因此可以减少停顿时间。
  2. 低停顿:由于采用了并发收集的方式,CMS收集器能够显著减少垃圾收集时的停顿时间。
  3. 标记-清除算法:CMS收集器使用标记-清除算法进行垃圾回收,这意味着它不会对内存进行压缩,可能会导致内存碎片问题。
  4. 增量式收集:CMS收集器在并发标记和并发清除阶段是增量式的,可以进一步减少停顿时间。
  5. 老年代收集:CMS收集器主要用于老年代的垃圾回收,通常与新生代的ParNew收集器配合使用。

本题详细解读

1. 并发收集

CMS收集器的最大特点是它的并发性。在传统的垃圾收集器中,垃圾收集过程通常需要暂停所有的应用线程(Stop-The-World),而CMS收集器在大部分工作阶段是与应用线程并发执行的。这意味着在垃圾收集过程中,应用程序可以继续运行,从而减少了停顿时间。

2. 低停顿

由于CMS收集器的并发性,它在垃圾收集时能够显著减少停顿时间。这对于那些对响应时间要求较高的应用场景(如Web服务器、数据库服务器)非常重要。CMS收集器的目标就是尽可能减少垃圾收集对应用的影响。

3. 标记-清除算法

CMS收集器使用的是标记-清除算法,而不是标记-整理算法。标记-清除算法不会对内存进行压缩,因此在垃圾回收后可能会产生内存碎片。这可能会导致在分配大对象时失败,即使总的可用内存足够。

4. 增量式收集

CMS收集器在并发标记和并发清除阶段是增量式的。这意味着它不会一次性完成所有的标记和清除工作,而是分阶段进行,进一步减少了每次停顿的时间。

5. 老年代收集

CMS收集器主要用于老年代的垃圾回收。通常,CMS收集器会与新生代的ParNew收集器配合使用。ParNew收集器是Serial收集器的多线程版本,专门用于新生代的垃圾回收。

6. 适用场景

CMS收集器适用于那些对响应时间要求较高的应用场景,如Web服务器、数据库服务器等。然而,由于CMS收集器不会对内存进行压缩,可能会导致内存碎片问题,因此在内存碎片较多的情况下,可能会导致Full GC的发生,进而导致较长的停顿时间。

7. 缺点

尽管CMS收集器有很多优点,但它也有一些缺点:

  • 内存碎片:由于使用标记-清除算法,可能会导致内存碎片问题。
  • CPU资源消耗:并发收集会占用一部分CPU资源,可能会影响应用程序的性能。
  • 无法处理浮动垃圾:在并发清理阶段,可能会产生新的垃圾(浮动垃圾),这些垃圾只能等到下一次GC时才能被回收。

总的来说,CMS收集器是一种以低停顿时间为目标的垃圾收集器,适用于对响应时间要求较高的应用场景,但在某些情况下可能会面临内存碎片和CPU资源消耗的问题。