标记清除算法是第一个能够回收循环数据结构的算法。现在最普遍的垃圾回收技术都是标记清除算法的变体。当使用标记清除算法,没有被引用的对象不会被立即回收。相反,垃圾回收器允许先累计一些没有任何引用的对象 到一定程度(比如内存不足时),然后启动回收。在回收过程中,执行的程序会被临时挂起。一旦回收结束,程序又能恢复执行。
标记清除算法又称为 根跟踪算法root tracing . 在JVM
中,GC
Roots 包括:
A:在VM 栈中,由本地变量引用的对象。
B:在方法去中的静态引用。
C:JNI(即native 方法)中的引用
从上述Roots 开始,能够访问到的对象称为LIVE 对象,访问不到的对象称为not live.标记清除算法包含两个阶段: 阶段1:找到并标记所有可以访问的对象,这个阶段称之为标记阶段。阶段2:gc在整个堆中扫描并回收所有没有被标记的对象,这个阶段称之为清除阶段。
为了将活跃对象和垃圾对象给区分开来,我们在对象中记录了对象的状态,在每个Object 中添加一个字段marked,默认值为false. 当对象创建时候,所有的对象的marked 都是false,也就是未标记的。
标记算法的伪代码:
void mark (Object p)
if (!p.marked)
p.marked = true;
for each Object q referenced by p
mark (q);
当一个对象已经被标记过后,上述的递归算法就什么也不做,因而这也能保证递归能够顺利结束。 当所有可以访问的对象都被标记上了后,上述方法就会终止。
清除算法的伪代码如下:
void sweep ()
for each Object p in
the heap
if (p.marked)
p.marked = false
else
heap.release (p);
在清除阶段,为了找出未被标记的对象,gc算法需要在整个heap中扫描所有的对象。在扫描过程中,那些未被标记的对象的空间就会被回收,同时在每个live对象中的marked也会被设置回false以便下次gc. 如下图所示:
图a显示了gc开始的条件,在此例子中,只有一个root变量。
图b显示了标记阶段的效果,在此阶段,所有活跃对象就已经被标记了。最后,
图C 显示了清除阶段完成留下的对象。在内存中,只有活跃对象保留了并且这个对象的marked字段都被重置为false.
标记清除算法的优点:
<!--[if !supportLists]-->1. <!--[endif]-->能够正确标记并回收垃圾,即使对于循环引用来说,也没有问题。
<!--[if !supportLists]-->2. <!--[endif]-->对引用变量的操作没有任何开销
标记清除算法的缺点:
1.导致应用程序挂起,对于那些有实时性约束的系统会带来一点问题。
标记清除算法引起的 碎片问题
碎片问题是在经历了好几次gc之后发生的现象。这个问题是在对中的对象容易变得比较分散,Live 的对象被一些小的没有分配的内存区域互相隔开来。 问题是,在某些情况下,即使实际上有足够的没有使用的内存,但是这些内存是不连续的, 由于对象通常占用连续的存储单元,,因此就变得有可能不能为一个对象分配空间.
标记清除算法不能标记出碎片,即使回收了所有垃圾对象的存储空间,堆可能会有太多的碎片而不能分配所需要的空间。
- 大小: 5.9 KB
分享到:
相关推荐
《Mark-Sweep垃圾收集器的C++实现》 在计算机科学中,内存管理是程序运行中的重要环节。当程序创建了大量的对象,而这些对象不再被使用时,如果没有得到妥善处理,就会导致内存泄漏,影响系统性能。为了解决这个...
JVM提供了多种GC算法,如串行GC、并行GC、并发Mark Sweep(CMS)和G1 GC等。 G1 GC是Oracle JVM从Java 6 Update 24引入的一种新一代垃圾收集器,它的设计目标是实现可预测的暂停时间模型,即在垃圾收集过程中,能...
在实际应用中,sweep算法常与其他垃圾回收策略如mark-and-compact(标记-压缩)或generational GC(代际GC)结合使用,以提高效率和减少停顿时间。然而,sweep算法单独使用时,可能会导致内存碎片问题,这会影响程序...
本主题聚焦于C语言中如何利用mark-sweep算法来实现垃圾回收机制。C语言本身并不支持内置的垃圾回收,但通过自定义的实现,我们可以为C程序引入这一功能。 **一、什么是Mark-Sweep算法** Mark-Sweep算法是最早的...
JvmGC 收集器是 JVM 中的三个主要 GC 收集器之一,分别是 Serial GC、Parallel GC 和 Concurrent Mark-and-Sweep GC。 Serial GC Serial GC 是 JVM 默认的 GC 收集器,它使用单个线程来执行 GC 操作。这种 GC 适合...
【CMS(Concurrent Mark Sweep)垃圾回收器】是Java虚拟机(JVM)中的一种垃圾收集器,专门针对老年代的内存管理。CMS回收器的主要目标是减少垃圾收集时的应用程序暂停时间,以提高用户体验。它引入了并发模式,允许...
"Mark-Sweep"算法主要分为两个阶段:标记(Mark)和清除(Sweep)。这个算法的核心思想是追踪并释放不再使用的内存块,从而防止内存泄漏。 1. **标记阶段**: 在这个阶段,垃圾收集器遍历程序中的所有可达对象,即...
1. 标记(Mark):GC会标记当前使用的对象,以便找到可以引用的所有对象。 2. 扫描(Sweep):GC会扫描标记后的对象,以便找到可以回收的对象。 3. 压缩(Compact):GC会压缩使用中的内存,以缩小堆所需要的工作...
本篇文章将深入探讨Dalvik虚拟机的垃圾收集过程,特别是采用的Mark-Sweep算法,以及在不同场景下触发GC的情况。 首先,垃圾收集的触发条件至关重要。Dalvik虚拟机在以下三种情况下会启动GC: 1. **GC_FOR_MALLOC**...
它主要分为两个阶段:标记(Mark)和清除(Sweep)。 1. **标记阶段(Marking)**: 在这个阶段,垃圾收集器从根对象(通常是全局变量和堆栈上的对象)开始,遍历整个对象图,标记所有可达的对象。可达对象指的是...
ART 运行时垃圾收集(GC)过程分析是一个复杂的过程,它使用了 Mark-Sweep 算法进行垃圾回收。与 Dalvik 虚拟机一样,ART 运行时也使用了 Mark-Sweep 算法,但是 ART 运行时对堆的划分更加细致,因而实现了更多样的...
- CMS(Concurrent Mark Sweep)GC:并行标记,低延迟,适用于响应时间敏感的应用。 - G1(Garbage-First)GC:新一代的垃圾收集器,目标是达到可预测的暂停时间。 4. GC调优 调优主要涉及选择合适的垃圾收集器...
gc-viz, 几种垃圾收集算法的动画可视化 gc几种垃圾收集算法的动画可视化。makeopen MARK_SWEEP_GC.gifGIF输出需要安装 ImageMagick 。 编辑生成文件以选择不同的算法。 如果向该示例添加更多数据,则可能必须增加G
垃圾回收算法有多种,包括串行 GC、并行 GC、并发 Mark and Sweep GC 等。串行 GC 使用简单的“标记-清扫-压缩”循环清理年轻代与年老代,适合内存占用较低、CPU 使用量较少的客户端系统。并行 GC 使用 N 个线程清理...
3. **垃圾收集器(Garbage Collector)**:JVM提供了多种垃圾收集器,如Serial GC、Parallel GC、Parallel Old GC、CMS(Concurrent Mark Sweep)和G1(Garbage-First)GC等。每种收集器有不同的工作策略和性能特点...
其次,GCViewer支持多种GC算法的分析,包括串行GC、并行GC、CMS(Concurrent Mark Sweep)、G1(Garbage-First)以及ZGC(Z Garbage Collector)等。不同的GC算法有着不同的优化目标和工作模式,通过GCViewer,...
3. **Concurrent Mark Sweep (CMS) Collector** - 并发标记清扫收集器,减少应用程序的暂停时间。 4. **G1 Collector** - 基于区域的垃圾收集器,旨在提供可预测的暂停时间和高吞吐量。 #### 六、永久代(PermGen...
Java提供了多种垃圾收集器,如Serial GC、Parallel GC、CMS(Concurrent Mark Sweep)GC、G1 GC以及ZGC(Z Garbage Collector)等。每种收集器都有其适用场景和优缺点,开发者可以根据应用程序的需求选择合适的垃圾...