type
status
date
slug
summary
tags
category
icon
password
在讨论CMS(Concurrent Mark-Sweep)垃圾收集器之前,先来理解一下为何需要垃圾收集(GC)以及它在Java虚拟机(JVM)中扮演的角色。随着应用程序的运行,对象会不断被创建。其中一些对象会变得不再被需要,即变成“垃圾”。如果这些不再被需要的对象不从内存中清除,那么内存将会被不断消耗,最终导致内存溢出错误。因此,垃圾收集的主要目的是找到并回收那些不再被应用程序所需要的对象,以释放和重用内存。
CMS垃圾收集器简介
CMS垃圾收集器是Java虚拟机中用于回收垃圾的一种收集器,它的全名是Concurrent Mark-Sweep,意为“并发标记-清除”。CMS设计的主要目标是减少应用程序暂停时间,特别是对于那些拥有大量内存和多核处理器的服务器应用程序而言。与传统的标记-清除或复制算法相比,CMS能够在回收内存的同时,允许应用程序线程并发地运行,这就大大减少了垃圾收集时的停顿时间。
CMS工作原理
CMS垃圾收集器的工作过程可以分为四个主要阶段:
- 初始标记(Initial Mark): 这个阶段标记所有从GC根直接可达的对象。由于需要停止所有的应用线程(Stop-The-World, STW),所以这个阶段会导致短暂的停顿。
- 并发标记(Concurrent Mark): 在这个阶段,GC遍历从初始标记阶段标记的对象出发,递归地标记所有可达的对象。这个阶段是并发执行的,不需要停止应用线程。
- 重新标记(Remark): 由于在并发标记阶段应用线程仍在运行,可能会有新的引用关系产生。因此,需要一个重新标记阶段来处理这期间变化的引用。这个阶段通常需要STW,但通过一些优化措施(如增量更新和卡表)可以尽量缩短停顿时间。
- 并发清除(Concurrent Sweep): 最后,GC会并发地清除那些未被标记的对象,释放内存。这个阶段同样不需要停止应用线程。
CMS的优缺点
优点:
- 减少停顿时间:CMS的主要优势是减少垃圾收集时的停顿时间,这对于需要高响应速度的应用来说非常重要。
- 并发执行:大部分阶段CMS都是与应用线程并发执行的,这使得它非常适合CPU资源充足的多核服务器。
缺点:
- 处理器资源占用:由于并发执行,CMS在垃圾收集过程中会占用一部分处理器资源,可能会影响应用程序的吞吐量。
- 内存碎片:CMS使用的标记-清除算法会导致内存碎片的产生,可能需要通过其他手段来整理碎片,以免影响大对象的分配。
- 不可预见的停顿:虽然CMS减少了停顿时间,但是在某些情况下(如并发模式失败),CMS可能会退回到全面垃圾收集,导致较长时间的停顿。
结语
CMS垃圾收集器是Java虚拟机提供的一种高级垃圾回收机制,它通过减少应用停顿时间来满足服务端应用的需要。尽管它有着明显的优势,但在实际使用中也需要权衡其对系统资源的占用以及可能出现的内存碎片问题。随着技术的发展,更多的垃圾收集算法和收集器被提出,如G1(Garbage-First)和ZGC(Z Garbage Collector)等,每种收集器都有其适用场景和优缺点。开发者在选择垃圾收集器时,需要根据应用程序的特点和需求,做出合适的选择
- 作者:奥利弗
- 链接:https://www.aolifu.org/article/CMS
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章