CMS收集器和G1收集器

发布时间 2023-07-17 16:39:59作者: xiaoovo

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
CMS的运作步骤分为以下四个:

  • 初始标记
  • 并发标记
  • 重新标记
  • 并发清除

其中,初始标记和重新标记都会引起stop the world。初始标记仅仅只是标记一下GC Roots能直接管理到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程,而重新标记则是修正并发标记过程中用户线程继续执行可能产生新的垃圾。
由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以,整体来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。通过下面这张图可以清楚看到CMS运作过程中需要停顿的时间。
image

G1收集器是JVM中的一种垃圾收集器,它主要面向于大规模内存的场景,能够高效地管理内存并降低延迟。G1收集器的垃圾回收过程可以分为以下几个步骤:

  • 初始标记(Initial Marking):在这个阶段,G1收集器会暂停所有线程,并对整个堆内存中的对象进行标记,记录哪些对象是可达的。
  • 并发标记(Concurrent Marking):在这个阶段,G1收集器会恢复所有线程,并使用并发标记算法对堆内存中的对象进行标记,记录哪些对象是可达的。这个阶段是与应用程序并发执行的,因此不会对应用程序的性能造成影响。
  • 最终标记(Final Marking):在这个阶段,G1收集器会再次暂停所有线程,并对堆内存中的对象进行标记,修正并发标记阶段可能出现的错误,确保所有不可达的对象都被正确地标记为垃圾对象。
  • 筛选回收(Live Data Counting and Evacuation):在这个阶段,G1收集器会对每个Region中的存活对象进行统计,并根据对象的存活时间将Region分为多个优先级。然后,根据用户的设置和优先级,制定回收计划,将存活对象移动到其他Region中,并清除垃圾对象所在的Region。这个阶段也是在线程暂停的状态下进行的,因此对应用程序的性能有一定的影响。

总的来说,G1收集器的垃圾回收过程相对复杂,但是它可以通过分区管理内存、优先级调度、增量式垃圾收集、并发标记清除和内存压缩等技术来提高程序的性能和稳定性。