Java 虚拟机(JVM)的垃圾回收机制是java实现自动内存管理的重要组成部分,而垃圾收集器则是实现这一机制的核心工具。随着 Java 应用程序规模和复杂性的增加,垃圾收集器也不断发展。本文将深入探讨两种在 JVM 中广泛使用的垃圾收集器:CMS 和 G1。
一、CMS(Concurrent Mark-Sweep)收集器
CMS是一种以减少停顿时间(STW,Stop-The-World)为目标的垃圾收集器,主要用于处理老年代的垃圾回收任务,适用于对延迟敏感的应用场景,如 Web 服务器。
1. CMS 的工作流程
CMS 收集器的工作流程可以分为以下几个阶段:
-
初始标记(Initial Mark):标记从 GC Roots 直接可达的对象。这个阶段会短暂地暂停所有应用线程,但耗时很短。
-
并发标记(Concurrent Mark):在初始标记完成后,CMS 开始并发地标记剩余的对象,即从 GC Roots 开始遍历整个对象图,标记所有可达的对象。这个阶段是与应用程序并行执行的,不会停止应用线程。
-
重新标记(Remark):由于在并发标记阶段,应用线程还在继续运行,可能导致一些新的对象变得可达,因此需要重新标记这些新对象。这个阶段也会短暂暂停应用线程,但耗时较短。
-
并发清除(Concurrent Sweep):在重新标记后,CMS 开始并发地清除未被标记的对象,释放内存空间。这个阶段同样是与应用程序并行执行的,不会停止应用线程。
2. CMS 的优点和缺点
优点:
- 低停顿时间:CMS 的主要优点是可以最大限度地减少垃圾回收引起的停顿时间,非常适合对延迟敏感的应用。
- 并发收集:大部分的垃圾回收操作与应用程序并行执行,减少了对应用性能的影响。
缺点:
- 高 CPU 开销:CMS 需要额外的 CPU 资源进行并发标记和清除,尤其在 CPU 资源有限的情况下,可能影响应用程序的性能。
- 内存碎片:CMS 采用标记-清除算法,可能导致老年代出现大量的内存碎片,进而影响大对象的分配。
- “Concurrent Mode Failure”:如果在并发清除阶段,老年代的内存不足以分配新的对象,会导致 CMS 失败,从而触发一次全堆的垃圾回收(Full GC),这会导致较长时间的停顿。
二、G1(Garbage-First)收集器
G1是一种面向服务端应用的垃圾收集器,设计目标是替代 CMS,提供更好的性能和可预测的停顿时间。
1. G1 的工作原理
G1 收集器将整个堆内存分成多个独立的区域(Region),每个区域大小相同,可以充当新生代、老年代甚至空闲区域。G1 通过优先回收垃圾最多的区域来达到更高效的垃圾回收,从而得名“Garbage-First”。
G1 的工作流程可以概括为以下几个阶段:
-
初始标记(Initial Mark):标记从 GC Roots 可达的对象,同时标记当前被引用的对象卡片(Card)。这一阶段需要短暂停顿应用线程。
-
并发标记(Concurrent Mark):从初始标记的 GC Roots 开始,对整个堆进行并发标记,识别出存活对象。这一阶段与应用程序并行执行。
-
最终标记(Final Mark):类似于 CMS 的重新标记阶段,G1 在并发标记完成后,对少量在标记期间变动的对象进行标记。这一阶段也需要短暂停顿应用线程。
-
筛选回收(Live Data Counting and Evacuation):G1 通过评估每个区域的垃圾量,优先回收垃圾最多的区域,并将存活对象复制到新区域中。这个阶段可能涉及部分停顿,取决于应用负载和回收策略。
2. G1 的优点和缺点
优点:
- 可预测的停顿时间:G1 的设计目标之一是提供可预测的停顿时间,通过用户指定的停顿时间目标(Pause Time Goal),G1 可以在垃圾回收期间尽量满足这个目标。
- 减少内存碎片:G1 采用标记-整理算法,通过将存活对象复制到新的区域,避免了内存碎片问题。
缺点:
- 复杂性:G1 的内部实现比 CMS 更加复杂,可能需要更多的调优工作以达到最佳性能。
- 应用场景局限性:在某些低延迟需求特别高的场景下,G1 的性能可能不如专门的低延迟收集器。
三、CMS 与 G1 的比较
-
停顿时间:CMS 主要优势在于低停顿时间,适合需要短停顿的应用场景;G1 则通过设定停顿时间目标,提供较为可预测的停顿时间,但可能牺牲一定的吞吐量。
-
内存管理:CMS 易于产生内存碎片,可能需要定期进行 Full GC 以整理内存;而 G1 通过区域化管理和标记-整理算法,有效地减少了内存碎片。
-
适用场景:CMS 更适合对延迟非常敏感的应用,如实时交易系统;G1 则适用于对停顿时间有一定要求,但更需要稳定性的中大型应用,如企业级服务系统。
四、总结
CMS 和 G1 是 JVM 中两种重要的垃圾收集器,各有优劣。CMS 以低停顿时间和并发处理著称,但在内存碎片和 CPU 开销方面有一定局限性。G1 则通过区域化管理和可预测的停顿时间目标,提供了更现代化的解决方案,特别适合大规模应用。还是那句话,没有最完美的,只有最适合的。我们应根据应用的具体需求,选择合适的垃圾收集器并进行相应的参数调优,以获得最佳的性能表现。