👌常见的jvm垃圾收集器的工作流程?

👌常见的jvm垃圾收集器的工作流程?

题目详细答案

Serial

Serial 垃圾收集过程的简单之处在于其采用了单线程执行的方式,以简化实现并减少资源占用。

  1. 暂停用户线程(Stop the World):

在开始垃圾收集过程之前,Serial 垃圾收集器会暂停(停止)所有的用户线程。这是为了确保在垃圾收集过程中对象的状态不会被修改,从而保证垃圾收集的准确性。

  1. 执行垃圾收集:

一旦用户线程暂停,Serial 垃圾收集器会开启一个单线程来执行垃圾回收操作。这个线程会遍历堆中的对象,标记并清理不再使用的对象,以释放内存空间。

  1. 等待垃圾收集完成:

在垃圾收集过程中,用户线程会被暂停,直到垃圾收集完毕。这意味着用户线程无法在垃圾收集期间执行任何操作。

当垃圾收集完成后,Serial 垃圾收集器会恢复用户线程的执行。此时,垃圾已被清理,堆内存中有更多的可用空间供应用程序使用。

Parallel Scavenge 和 Parallel Old

Parallel Scavenge 和 Parallel Old 是 Parallel 收集器系列的两个组成部分,它们的工作机制相似,都是利用多线程并行执行垃圾回收操作,以提高整个垃圾收集过程的效率和吞吐量。以 Parallel Scavenge 为例来说明其工作机制:

  1. 多线程并行执行:Parallel Scavenge 收集器利用了多个线程并行执行新生代的垃圾回收操作。这意味着在进行新生代垃圾回收时,多个线程同时工作,加快了垃圾收集的速度。
  2. 暂停用户线程:与 Serial 收集器类似,Parallel Scavenge 在进行垃圾收集时会暂停用户线程,以确保垃圾回收的准确性。这一阶段通常称为“Stop the World”。
  3. 多线程并发清理:Parallel Scavenge 收集器的特点之一是在新生代垃圾收集过程中采用并发清理的方式。这意味着在暂停用户线程期间,多个线程同时清理新生代中的垃圾对象,从而更快地完成垃圾收集过程。

通过利用多个线程并行执行垃圾收集操作,Parallel Scavenge 能够充分发挥多核 CPU 的优势,提高了垃圾收集的效率。相比于 Serial 收集器,它能更快地完成垃圾回收操作,从而减少了应用程序的停顿时间,从而提高了整个应用程序的性能。

ParNew 和 Parallel Scavenge

ParNew 收集器和 Parallel Scavenge 收集器在工作流程上确实非常相似,都是并行垃圾收集器。

1、 标记阶段

在垃圾收集开始时,ParNew 收集器会暂停所有应用线程(Stop-The-World),然后开始标记所有存活的对象。标记阶段的主要任务是识别哪些对象是存活的,并将它们标记出来。

2、 复制阶段

在标记阶段完成之后,ParNew 收集器会将所有存活的对象从 Eden 区和一个 Survivor 区(例如 S0)复制到另一个 Survivor 区(例如 S1)。如果目标 Survivor 区没有足够的空间容纳所有存活对象,存活对象将被移动到老年代。

3、 清理阶段

复制阶段完成后,Eden 区和之前的 Survivor 区(例如 S0)中的所有对象都被认为是垃圾,并且这些区域的内存可以被清理和重用。

4、 应用程序恢复

在清理阶段完成之后,应用程序线程将被重新启动,继续执行。

ParNew 收集器的工作流程与 Parallel Scavenge 收集器类似,都是通过停止应用程序线程,然后利用多线程并行执行垃圾回收操作,最后恢复用户线程的执行。这种并行执行的方式能够提高垃圾收集的效率,同时在暂停用户线程期间确保垃圾收集的准确性。

CMS

CMS垃圾收集器为了尽量减少用户线程的停顿时间,采用了一种创新的策略。这一策略使得在垃圾回收过程的某些阶段,用户线程和垃圾回收线程可以共同工作,从而避免了长时间的垃圾回收导致用户线程一直处于等待状态。

整个 CMS 垃圾收集过程被划分为四个阶段,它们分别是:

  1. 初始标记:在这个阶段,CMS 垃圾收集器会对根对象进行一次快速的标记,标记出所有与根对象直接关联的存活对象。这个阶段需要暂停用户线程,因为要确保标记的准确性。
  2. 并发标记:在这个阶段,CMS 垃圾收集器会与用户线程并发执行,对整个堆进行标记。垃圾回收线程会在后台标记所有存活对象,而用户线程可以继续执行,不受影响。
  3. 重新标记:在并发标记阶段结束后,CMS 垃圾收集器会进行一次重新标记,来处理在并发标记阶段发生变化的对象。这个阶段需要暂停用户线程,以确保标记的准确性。
  4. 并发清理:在重新标记完成后,CMS 垃圾收集器会与用户线程并发执行,清理未标记的对象。垃圾回收线程会在后台清理不再使用的对象,而用户线程可以继续执行,不受影响。

通过将垃圾回收过程分为多个阶段,并在其中允许用户线程和垃圾回收线程并发执行,CMS 垃圾收集器成功地减少了用户线程的停顿时间。这种创新的并发垃圾收集策略提高了系统的响应性和用户体验,确保了应用程序的顺畅运行。

G1

G1 垃圾收集器的回收流程与 CMS 的逻辑大致相同,包括初始标记、并发标记、重新标记和筛选清除等阶段。但是,与 CMS 不同的是,G1 在最后一个阶段不会直接进行整体的清除。相反,它会根据用户设置的停顿时间进行智能的筛选和局部的回收。

  1. 初始标记:在初始标记阶段,G1 垃圾收集器会对根对象进行一次快速的标记,标记出所有与根对象直接关联的存活对象。这个阶段需要暂停用户线程,以确保标记的准确性。
  2. 并发标记:在并发标记阶段,G1 垃圾收集器会与用户线程并发执行,对整个堆进行标记。垃圾回收线程会在后台标记所有存活对象,而用户线程可以继续执行,不受影响。
  3. 重新标记:在并发标记阶段结束后,G1 垃圾收集器会进行一次重新标记,来处理在并发标记阶段发生变化的对象。这个阶段需要暂停用户线程,以确保标记的准确性。
  4. 筛选清除:在重新标记完成后,G1 垃圾收集器不会立即进行整体的清除操作。相反,它会根据用户设置的停顿时间智能地筛选出需要回收的 Region,并执行局部的回收。这样可以在尽量满足停顿时间的情况下,最大限度地回收垃圾。

通过这种智能的筛选和局部回收方式,G1 垃圾收集器能够更好地平衡垃圾回收的效率和停顿时间,从而提高系统的响应性和用户体验。

ZGC

ZGC 的垃圾回收过程几乎全部都是并发执行的,即与应用程序线程同时进行。

  1. 初始标记(Initial Mark):在初始标记阶段,ZGC 会标记出根对象以及直接与根对象关联的存活对象。这个阶段需要短暂地暂停所有应用线程,以确保标记的准确性。
  2. 并发标记(Concurrent Mark):在并发标记阶段,ZGC 与应用程序线程并发执行,标记所有存活对象。这个阶段不会暂停应用程序线程,因此垃圾回收和应用程序可以并发执行。
  3. 最终标记(Final Mark):在并发标记阶段结束后,ZGC 需要再次短暂地暂停所有应用线程,完成最终的标记工作。这个阶段主要用于标记在并发标记阶段有可能发生变化的对象。
  4. 筛选(Concurrent Sweep):在最终标记完成后,ZGC 会进行一次筛选,确定哪些对象可以被回收。这个阶段会并发地进行,不会暂停应用程序线程。
  5. 并发清除(Concurrent Cleanup):在筛选阶段完成后,ZGC 会并发地清除未被标记的对象,释放它们所占用的内存。这个阶段也不会暂停应用程序线程。
 wechat
天生我才必有用