`

Mark&Sweep GC

 
阅读更多

 

 

    标记清除算法是第一个能够回收循环数据结构的算法。现在最普遍的垃圾回收技术都是标记清除算法的变体。当使用标记清除算法,没有被引用的对象不会被立即回收。相反,垃圾回收器允许先累计一些没有任何引用的对象 到一定程度(比如内存不足时),然后启动回收。在回收过程中,执行的程序会被临时挂起一旦回收结束,程序又能恢复执行。

   标记清除算法又称为 根跟踪算法root tracing . JVM 中,GC Roots 包括:

   A:VM 栈中,由本地变量引用的对象。

   B:在方法去中的静态引用。

   C:JNI(即native 方法)中的引用

   从上述Roots 开始,能够访问到的对象称为LIVE 对象,访问不到的对象称为not live.标记清除算法包含两个阶段: 阶段1:找到并标记所有可以访问的对象,这个阶段称之为标记阶段。阶段2gc在整个堆中扫描并回收所有没有被标记的对象,这个阶段称之为清除阶段。

   为了将活跃对象和垃圾对象给区分开来,我们在对象中记录了对象的状态,在每个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算法写的GarbageCollation(C++)

    《Mark-Sweep垃圾收集器的C++实现》 在计算机科学中,内存管理是程序运行中的重要环节。当程序创建了大量的对象,而这些对象不再被使用时,如果没有得到妥善处理,就会导致内存泄漏,影响系统性能。为了解决这个...

    深入理解JVM & G1 GC

    JVM提供了多种GC算法,如串行GC、并行GC、并发Mark Sweep(CMS)和G1 GC等。 G1 GC是Oracle JVM从Java 6 Update 24引入的一种新一代垃圾收集器,它的设计目标是实现可预测的暂停时间模型,即在垃圾收集过程中,能...

    mark-sweep-master.zip_sweep算法_垃圾

    在实际应用中,sweep算法常与其他垃圾回收策略如mark-and-compact(标记-压缩)或generational GC(代际GC)结合使用,以提高效率和减少停顿时间。然而,sweep算法单独使用时,可能会导致内存碎片问题,这会影响程序...

    C语言,基于mark-sweep算法实现的垃圾回收机制.zip

    本主题聚焦于C语言中如何利用mark-sweep算法来实现垃圾回收机制。C语言本身并不支持内置的垃圾回收,但通过自定义的实现,我们可以为C程序引入这一功能。 **一、什么是Mark-Sweep算法** Mark-Sweep算法是最早的...

    JvmGC收集器

    JvmGC 收集器是 JVM 中的三个主要 GC 收集器之一,分别是 Serial GC、Parallel GC 和 Concurrent Mark-and-Sweep GC。 Serial GC Serial GC 是 JVM 默认的 GC 收集器,它使用单个线程来执行 GC 操作。这种 GC 适合...

    了解CMS(ConcurrentMarkSweep)垃圾回

    【CMS(Concurrent Mark Sweep)垃圾回收器】是Java虚拟机(JVM)中的一种垃圾收集器,专门针对老年代的内存管理。CMS回收器的主要目标是减少垃圾收集时的应用程序暂停时间,以提高用户体验。它引入了并发模式,允许...

    mark-sweep:C语言中一个简单的标记清除垃圾收集器

    "Mark-Sweep"算法主要分为两个阶段:标记(Mark)和清除(Sweep)。这个算法的核心思想是追踪并释放不再使用的内存块,从而防止内存泄漏。 1. **标记阶段**: 在这个阶段,垃圾收集器遍历程序中的所有可达对象,即...

    什么是GC,GC是什么意思为什么要有GC

    1. 标记(Mark):GC会标记当前使用的对象,以便找到可以引用的所有对象。 2. 扫描(Sweep):GC会扫描标记后的对象,以便找到可以回收的对象。 3. 压缩(Compact):GC会压缩使用中的内存,以缩小堆所需要的工作...

    Dalvik虚拟机垃圾收集(GC)过程分析.docx

    本篇文章将深入探讨Dalvik虚拟机的垃圾收集过程,特别是采用的Mark-Sweep算法,以及在不同场景下触发GC的情况。 首先,垃圾收集的触发条件至关重要。Dalvik虚拟机在以下三种情况下会启动GC: 1. **GC_FOR_MALLOC**...

    mark-sweep-algorithm:使用John McCarthy提出的标记清除算法实现一个简单的垃圾收集器

    它主要分为两个阶段:标记(Mark)和清除(Sweep)。 1. **标记阶段(Marking)**: 在这个阶段,垃圾收集器从根对象(通常是全局变量和堆栈上的对象)开始,遍历整个对象图,标记所有可达的对象。可达对象指的是...

    ART运行时垃圾收集(GC)过程分析.docx

    ART 运行时垃圾收集(GC)过程分析是一个复杂的过程,它使用了 Mark-Sweep 算法进行垃圾回收。与 Dalvik 虚拟机一样,ART 运行时也使用了 Mark-Sweep 算法,但是 ART 运行时对堆的划分更加细致,因而实现了更多样的...

    jvm 参数及gc详解

    - CMS(Concurrent Mark Sweep)GC:并行标记,低延迟,适用于响应时间敏感的应用。 - G1(Garbage-First)GC:新一代的垃圾收集器,目标是达到可预测的暂停时间。 4. GC调优 调优主要涉及选择合适的垃圾收集器...

    gc-viz, 几种垃圾收集算法的动画可视化.zip

    gc-viz, 几种垃圾收集算法的动画可视化 gc几种垃圾收集算法的动画可视化。makeopen MARK_SWEEP_GC.gifGIF输出需要安装 ImageMagick 。 编辑生成文件以选择不同的算法。 如果向该示例添加更多数据,则可能必须增加G

    Java 内存结构备忘录1

    垃圾回收算法有多种,包括串行 GC、并行 GC、并发 Mark and Sweep GC 等。串行 GC 使用简单的“标记-清扫-压缩”循环清理年轻代与年老代,适合内存占用较低、CPU 使用量较少的客户端系统。并行 GC 使用 N 个线程清理...

    jvm gc

    3. **垃圾收集器(Garbage Collector)**:JVM提供了多种垃圾收集器,如Serial GC、Parallel GC、Parallel Old GC、CMS(Concurrent Mark Sweep)和G1(Garbage-First)GC等。每种收集器有不同的工作策略和性能特点...

    gcviewer-1.33

    其次,GCViewer支持多种GC算法的分析,包括串行GC、并行GC、CMS(Concurrent Mark Sweep)、G1(Garbage-First)以及ZGC(Z Garbage Collector)等。不同的GC算法有着不同的优化目标和工作模式,通过GCViewer,...

    JVM_GC调优

    3. **Concurrent Mark Sweep (CMS) Collector** - 并发标记清扫收集器,减少应用程序的暂停时间。 4. **G1 Collector** - 基于区域的垃圾收集器,旨在提供可预测的暂停时间和高吞吐量。 #### 六、永久代(PermGen...

    gc回收机制

    Java提供了多种垃圾收集器,如Serial GC、Parallel GC、CMS(Concurrent Mark Sweep)GC、G1 GC以及ZGC(Z Garbage Collector)等。每种收集器都有其适用场景和优缺点,开发者可以根据应用程序的需求选择合适的垃圾...

Global site tag (gtag.js) - Google Analytics