JVM GC算法图示:标记-清除算法的执行过程_算法


标记-清除算法(Mark-Sweep)是一种基本的垃圾回收算法,用于清除不再被引用的对象并释放内存空间。下面是标记-清除算法的工作流程:

  1. 标记(Mark):从根对象(如栈中的引用、静态变量等)开始,垃圾回收器遍历对象图,标记所有可以从根对象访问到的存活对象。标记的方式可以通过追踪对象引用关系、遍历对象图等方式实现。
  2. 清除(Sweep):在标记完成后,垃圾回收器遍历整个堆内存,清除所有未被标记(即不可达)的对象。清除的对象将被标记为可用内存,并可以重新分配给新的对象。

标记-清除算法的主要优点是它可以处理动态分配和释放内存的系统,而不需要移动对象。它可以处理任意形状和大小的对象,而不会产生内存碎片。然而,标记-清除算法也存在一些缺点:

  1. 内存碎片:清除阶段会留下不连续的内存空间,导致内存碎片化。这可能会增加内存分配的复杂性,降低内存利用率。
  2. 停顿时间:标记-清除算法在垃圾回收过程中会停止应用程序的执行。这会导致较长的停顿时间,可能会对实时应用程序或对响应时间敏感的应用程序造成影响。
  3. 效率低下:标记-清除算法需要遍历整个堆内存来标记和清除对象。对于大型堆和存活对象较多的场景,算法的效率可能较低。

由于标记-清除算法的缺点,现代的JVM垃圾回收器通常采用更高级的垃圾回收算法,如复制算法、标记-压缩算法、分代垃圾回收算法等,以改进性能和内存利用率,并减少停顿时间。