随笔分类 -  垃圾回收算法

各种垃圾的回收
Python对象的循环引用问题
摘要:[toc] Python对象循环引用 我们来介绍一下 Python 是采用何种途径解决循环引用问题的。 循环引用垃圾回收算法 上图中,表示的是对象之间的引用关系,从自对象指向他对象的引用用黑色箭头表示。 每个对象里都有计数器 。而图中右侧部分可以很清晰的看到是循环引用的垃圾对象。 上图,将每个对象的 阅读全文

posted @ 2019-01-01 23:08 Léon_The_Pro 阅读(6297) 评论(1) 推荐(1) 编辑

Python中的引用计数法
摘要:[toc] 引用计数法 增量操作 如果对象的引用数量增加,就在该对象的计数器上进行增量操作。在实际中它是由宏Py_INCREF() 执行的。 除了增量操作外,还要执行NULL检查,Py_XINCREF(op)。 计数器溢出的问题 Include/object.h ssize_t型,在32位环境下是i 阅读全文

posted @ 2018-12-24 01:24 Léon_The_Pro 阅读(1490) 评论(0) 推荐(0) 编辑

Python对象引用的所有权
摘要:[toc] 引用所有权 谁持有对象引用的所有权,谁就要对对象负责。 引用的所有权对函数的返回值和参数有重大的意义。 传递引用的所有权 返回值 传递引用的所有权指的是函数把引用的所有权和返回值一起交个调用方。 把指向对象的引用返回给调用方的函数一般都会将所有权一起交给调用方。如果函数的调用方拿到了引用 阅读全文

posted @ 2018-12-18 15:27 Léon_The_Pro 阅读(358) 评论(0) 推荐(0) 编辑

Incermental GC
摘要:[toc] 增量式垃圾回收 增量式垃圾回收 Incremental GC 一种通过逐渐推进垃圾回收来控制mutator最大暂停时间的方法。 什么是增量式垃圾回收 有时候GC时间太长会导致mutator迟迟不能进行。如下图示: 这样的GC称为停止型GC(Stop the world GC)。 为此出现 阅读全文

posted @ 2018-12-18 15:22 Léon_The_Pro 阅读(469) 评论(0) 推荐(0) 编辑

RC Immix
摘要:[toc] RC Immix Rifat Shariyar等,Reference Counting Immix,2013 目的 RC Immix算法将引用计数的一大缺点(吞吐量低)改善到了实用的级别。本算法改善了引用计数算法的“合并型引用计数法”和Immix组合起来使用。 合并型引用计数 Yossi 阅读全文

posted @ 2018-12-18 15:19 Léon_The_Pro 阅读(758) 评论(0) 推荐(0) 编辑

Generational GC (Part one )
摘要:[toc] Generationanl GC 引入年龄的概念,优先回收年轻的已成为垃圾的对象。 什么是分代垃圾回收 对象对的年龄 书上说:“人们 从众多案例总结出一个经验:‘大部分的对象再生成后马上就变成了垃圾。很少有对象活的很久’。”,分代,引入年龄概念,经历过一次GC的对象年龄为一岁。 新生代对 阅读全文

posted @ 2018-12-18 15:16 Léon_The_Pro 阅读(1034) 评论(0) 推荐(0) 编辑

Conservative GC (Part two :MostlyCopyingGC )
摘要:[TOC] MostlyCopyingGC Mostly Copying GC, Joel F.Bartlett, 1989 此算法可以在不明确根的环境中运行GC复制算法。 概要 Mostly Copying GC就是“把不明确的根指向的对象以外的对象都进行复制”,抛开那些不能移动的对象将其他大部分 阅读全文

posted @ 2018-11-29 16:47 Léon_The_Pro 阅读(298) 评论(0) 推荐(0) 编辑

Conservative GC (Part one)
摘要:[toc] 保守式GC 保守式GC(Conservative GC)指“不能识别指针和非指针的GC” 不明确的根 不明确的根(ambiguous roots),下面三类都可以作为根。 事实上是不明确的根 寄存器 调用栈 全局变量空间 以栈为例 :在调用栈中有调用帧(call frame),调用帧里面 阅读全文

posted @ 2018-11-26 06:43 Léon_The_Pro 阅读(366) 评论(0) 推荐(0) 编辑

Mark Compact GC (Part two :Two-Finger)
摘要:[toc] Two Finger算法 Robert A.Saunders 对堆执行两次搜索 前提 Two Finger 算法, 必须将所有对象整理成大小一致 。它没有在对象的头中设立forwarding指针,而是 在对象的域中设立forwarding指针 即可。 概要 Two Finger算法由一下 阅读全文

posted @ 2018-11-26 02:49 Léon_The_Pro 阅读(376) 评论(0) 推荐(0) 编辑

Mark Compact GC (Part one: Lisp2)
摘要:[toc] 什么是GC 标记 压缩算法 需要对标记清除和GC复制算法有一定了解 GC标记 压缩算法是由 标记阶段 和 压缩阶段 构成。 标记阶段和标记清除的标记阶段完全一样。之后我们要通过搜索数次堆来进行压缩。 Lisp2 算法的对象 Donald E.Knuth 对象结构如图示: Lisp2 算法 阅读全文

posted @ 2018-11-26 02:40 Léon_The_Pro 阅读(435) 评论(0) 推荐(0) 编辑

Copying GC (Part two :Multi Space Copying GC)
摘要:[toc] 近似深度优先搜索方法 Paul R.Wilson、Michael S.Lam、Thomas G.Moher,1991 这个方法只是近似深度优先搜索,但可以做到深度优先执行GC复制算法。 Cheney的GC复制算法 假设所有对象都是2个字,下图所示是对象间的引用关系。 下图所示是执行该算法 阅读全文

posted @ 2018-11-26 02:35 Léon_The_Pro 阅读(308) 评论(0) 推荐(0) 编辑

Copying GC (Part one)
摘要:[toc] GC复制算法 Copying GC,Marvin L.Minsky,1963 该算法吧某个空间里的活动对象复制到其他空间,把原空间里的所有对象进行回收。再此我们 把复制活动对象的空间称为From空间,将粘贴活动对象的空间称为To空间 。 先介绍Robert R.Fenichel与Jero 阅读全文

posted @ 2018-11-20 22:50 Léon_The_Pro 阅读(437) 评论(0) 推荐(0) 编辑

Reference Counting GC (Part two :Partial Mark & Sweep)
摘要:[toc] 部分标记清除算法 Partial Mark & Sweep,Rafael D.Lins,1992 之前我们说过,引用计数的循环引用问题。这个问题可以通过标记清除算法辅助解决。但是这种方法效率很低,标记清除是单纯的为了回收有循环引用的垃圾,而这种垃圾又是很少的。单纯的GC标记清除算法又是以 阅读全文

posted @ 2018-11-20 14:27 Léon_The_Pro 阅读(395) 评论(0) 推荐(0) 编辑

Reference Counting GC (Part one)
摘要:[toc] 引用计数法 George E.Collins.1960. 引用计数算法中引入了一个概念 计数器 。计数器代表对象被 引用的次数 ,它是无符号正整数用于计数器的位数根据算法和实现有所不同。本文结构如下图所示。 在变更数组元素等的时候会进行指针的更新。通过更新指针,可能会产生没有被任何程序引 阅读全文

posted @ 2018-11-19 22:48 Léon_The_Pro 阅读(328) 评论(0) 推荐(0) 编辑

Mark Sweep GC
摘要:[toc] 标记清除算法 GC 标记 清除算法是由 标记阶段 和 清除阶段 构成。标记阶段把所有活动的对象做上标记。清除阶段是吧没有标记的对象也就是非活动的对象进行回收。通过这两个阶段就可以对空间进行重新利用。 mark_sweep()函数 在执行GC前堆的状态 标记阶段 使用 mark_phase 阅读全文

posted @ 2018-11-13 04:49 Léon_The_Pro 阅读(331) 评论(0) 推荐(0) 编辑

导航