GC标记-清除算法(Mark Sweep GC)

  • 世界上第一个GC算法,由 JohnMcCarthy 在1960年发布。


标记-清除算法由标记阶段和清除阶段构成。

  1. 标记阶段就是把所有的活动对象都做上标记的阶段。

    • 标记阶段就是“遍历对象并标记”的处理过程。
    • 标记阶段经常用到深度优先搜索。
  2. 清除阶段就是把那些没有标记的对象,也就是非活动对象回收的阶段。
    • 清除阶段collector会遍历整个堆,回收没有打上标记的对象(即垃圾)。
    • 内存的合并操作也是在清除阶段进行的。
  3. 分配
    • 分配指将回收的内存空间进行再利用。
    -> 伪代码实现内存分配
    
    new_obj(size){
        chunk = pickup_chunk(size, $free_list)
        if(chunk != NULL)
            return chunk
        else
            allocation_fail() //大招,销毁并释放全部空间
    }

优点

  1. 实现简单
  2. 与保守式GC算法兼容

缺点

  1. 碎片化(fragmentation)

    • 使用过程中会逐渐产生被细化的分块
  2. 分配速度
    • 分块不连续,每次分配都必须遍历空闲链表,以便找到足够大的分块。
    • 最糟的情况就是每次分配都要遍历全部空闲链表
  3. 与写时复制技术(copy-on-write)不兼容

为了解决分配速度的问题, 人们提出了两种方法

  • 使用多个空闲链表(multiple free-list)

    • 类似于建立索引的方法。
    • 为了防止空闲链表(也就是索引)的数组过大的问题,通常会给分块大小设定一个上限。
    • 大于这个上限的按照一个空闲链表处理。
      • ex.
      • 设置上限为100
      • 那么准备1~100及大于等于101个字的100个空闲链表就可以了。
    -> 伪代码实现使用多个空闲链表的内存分配
    
    new_obj(size){
        index = size / (WORD_LENGTH / BYTE_LENGTH)
        if(index <= 100)
            if($free_list[index] != NULL)
                chunk = $free_list[index]
                return chunk
        else
            chunk = pickup_chunk(size, $free_list[101])
            if(chunk != NULL)
                return chunk
    
        allocation_fail() //大招,销毁并释放全部空间
    }
  • BiBOP(Big Bag Of Pages)法

原文地址:https://www.cnblogs.com/leisurelylicht/p/GC-biao-jiqing-chu-suan-fa-Mark-Sweep-GC.html

时间: 2024-10-14 19:38:02

GC标记-清除算法(Mark Sweep GC)的相关文章

CMS为什么采用“标记-清除”算法

分代式GC里,年老代常用mark-sweep:或者是mark-sweep/mark-compact的混合方式,一般情况下用mark-sweep,统计估算碎片量达到一定程度时用mark-compact.这是因为传统上大家认为年老代的对象可能会长时间存活且存活率高,或者是比较大,这样拷贝起来不划算,还不如采用就地收集的方式.Mark-sweep.mark-compact.copying这三种基本算法里,只有mark-sweep是不移动对象(也就是不用拷贝)的,所以选用mark-sweep. 简要对比

标记清除算法

function mark(p, level){ if(level >3){ return ; } if(typeof p == "object" && p != null && p.marked == undefined){ p.marked = true; console.log(p); for(var prop in p){ mark(p[prop], level+1); } } } var g1={name:"xiaoming&q

图解系列之垃圾收集标记-清除算法

原文地址:http://blog.51cto.com/4837471/2324571

Copying GC (Part two :Multi Space Copying GC)

目录 近似深度优先搜索方法 Cheney的GC复制算法 前提 执行结果 多空间复制算法 multi_space_copying()函数 mark_or_copy() copy() 执行过程 优缺点 近似深度优先搜索方法 Paul R.Wilson.Michael S.Lam.Thomas G.Moher,1991 这个方法只是近似深度优先搜索,但可以做到深度优先执行GC复制算法. Cheney的GC复制算法 假设所有对象都是2个字,下图所示是对象间的引用关系. 下图所示是执行该算法时候,各个对象

【转载】GC基本算法及C++GC机制

原文: GC基本算法及C++GC机制 阅读目录 前言 基本概念 有向可达图与根集 三种基本的垃圾收集算法及其改进算法 1.引用计数算法 2. Mark & Sweep 算法 3. 节点复制算法 分代回收 C++垃圾回收机制 参考书籍 正文 回到顶部 前言 垃圾收集器是一种动态存储分配器,它自动释放程序不再需要的已分配的块,这些块也称为垃圾.在程序员看来,垃圾就是不再被引用的对象.自动回收垃圾的过程则称为垃圾收集(garbage collection).在一个支持垃圾收集的语言中,程序显式地申请内

GC 算法(实现篇) - GC参考手册

您应该已经阅读了前面的章节: 垃圾收集简介 - GC参考手册 Java中的垃圾收集 - GC参考手册 GC 算法(基础篇) - GC参考手册 学习了GC算法的相关概念之后, 我们将介绍在JVM中这些算法的具体实现.首先要记住的是, 大多数JVM都需要使用两种不同的GC算法 -- 一种用来清理年轻代, 另一种用来清理老年代. 我们可以选择JVM内置的各种算法.如果不通过参数明确指定垃圾收集算法, 则会使用宿主平台的默认实现.本章会详细介绍各种算法的实现原理. 下面是关于Java 8中各种组合的垃圾

4. GC 算法(实现篇) - GC參考手冊

您应该已经阅读了前面的章节: 垃圾收集简单介绍 - GC參考手冊 Java中的垃圾收集 - GC參考手冊 GC 算法(基础篇) - GC參考手冊 学习了GC算法的相关概念之后, 我们将介绍在JVM中这些算法的详细实现. 首先要记住的是, 大多数JVM都须要使用两种不同的GC算法 -- 一种用来清理年轻代, 还有一种用来清理老年代. 我们能够选择JVM内置的各种算法. 假设不通过參数明白指定垃圾收集算法, 则会使用宿主平台的默认实现. 本章会详细介绍各种算法的实现原理. 以下是关于Java 8中各

JVM优化 垃圾回收 算法 垃圾收集器 GC日志可视化查看

今日内容了解什么是垃圾回收掌握垃圾会回收的常见算法学习串行.并行.并发.G1垃圾收集器学习GC日志的可视化查看 1.什么是垃圾回收?程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存 资源,最终将导致内存溢出,所以对内存资源的管理是非常重要了. 1.1.C/C++语言的垃圾回收在C/C++语言中,没有自动垃圾回收机制,是通过new关键字申请内存资源,通过delete 关键字释放内存资源.如果,程序员在某些位置没有写delete进行释放,那么申请的对象将一直占用内存资源,

Mark Compact GC (Part one: Lisp2)

目录 什么是GC 标记-压缩算法 Lisp2 算法的对象 概要 步骤 步骤一:设定forwarding指针 步骤二:更新指针 步骤三:移动对象 优缺点 什么是GC 标记-压缩算法 需要对标记清除和GC复制算法有一定了解 GC标记-压缩算法是由标记阶段和压缩阶段构成. 标记阶段和标记清除的标记阶段完全一样.之后我们要通过搜索数次堆来进行压缩. Lisp2 算法的对象 Donald E.Knuth 对象结构如图示: Lisp2 算法在对象头中为forwarding指针留出空间,forwarding指