Python垃圾回收

python采用引用计数法进行垃圾回收

Python内存分配

  • python在分配内存空间时,在malloc之上堆放了3个独立的分层。
  • python内存分配时主要由arena、pool和block三个构成。

第0层

  • 该层指glibc的malloc()这样的分配器,是对OS申请内存的部分。
  • python中如果生成的对象大于256B直接调用malloc,否则直接通过第1、2层分配。

第1层

  • 该层主要管理arena,arena大小固定为256KB,其中保存了arena中开头的pool的地址。
  • 同时保持被分配的pool的数量、将空pool连接到单向链表的功能。
  • arena是被数组arenas管理。
  • unused_arena_objects单向链表连接未使用的arena,包括新生的或使用过但已废弃的。
  • usable_arenas双链表,其中arena分配了可利用的pool。

第2层

  • 该层主要管理pool中的block,大小固定为4KB,每个pool的开头地址按照4KB的倍数对齐,与OS的页重合。
  • 在arena中将各个pool相连接。
  • pool被分隔成一个个的block,在pool初始化时就决定了该pool内的block的大小,block的大小是8B的整数倍,最大不超过256B。
  • Python分配时使用Best-fit,分配的block的大小最接近申请大小。
  • usedpools是保持pool的数组,每个pool用双向链表相连,数组中第一个位置中的是8B的pool集合直到第32个位置中的256B的pool。
  • 当usedpools中的pool的所有block被释放给arena。
  • block包括已经分配、使用完毕和未使用三种状态,后两者均可以将对象分配进去。
  • pool中定义了freeblock空闲表,用于链接使用完毕的block,而未使用的则在pool开头的nextoffset记录已分配的偏移。

分配

  • 根据申请的大小找到usedpools的索引。
  • 当usedpools中指定索引的pool被分配了则从pool中freeblock尝试获取block,不行则通过偏移取出block,如果pool内没有能分配的block则将pool从usedpools中移除。
  • 如果没有block则通过new_arena将新的arena添加到usable_arensa中,如果分配失败则调用malloc。
  • 初始化pool,从arena的freepools中获取一个pool插入到usedpools的开头,而后检查pool固定block大小与申请的block大小是否相同,如果不同则还需要初始化pool

释放

  • 将释放对象的block连接到freeblock。
  • 当pool内无已经分配的pool则将该pool连接到arena的freepools同时从usedpools中移除。
  • 当arena为空,从usable_arena移除,连接到unused_arena_objects中。
  • 当arena只有一个空pool时,即之前所有pool均被使用此时释放了一个pool,因此需要加入到usable_arenas。
  • usable_arenas内按照空pool的数量从小到大进行排序。usedpools也是优先使用被利用最多的pool。

对象特有的分配器

  • python中各种类型的对象持有各自的分配器。
  • 不同的对象拥有不同的空闲链表(数组),使用完毕的对象初始化后加入到该链表。
  • 如果空闲链表满了则直接释放。

引用计数

  • 对象内部有个计数器,32位环境下为int型,64位环境下为long型,指针为4的倍数因此使用这个长度还能多出两位。

循环引用垃圾回收

  • 对象链表(双向链表)连接各个对象,对象的引用计数器复制到自对象内的另一个位置。
  • 对复制的计数器中非根直接引用的减1。
  • 将对象分为可能到达的对象的链表,复制计数器大于1或有从活动对象的引用。
  • 将其余对象放如不可能到达的对象的链表,这些对象即是循环引用垃圾。
  • 容器对象:可能保留了指向其他对象的运用的对象
  • 循环引用的对象只可能出现在容器对象,可以将容器对象用对象链表连接。
  • 分代容器对象链表,分为3代,每代有个阈值,超过该阈值则进行该代的回收。同时每回收一次进行晋升一次。

《垃圾回收的算法与实现》——Python垃圾回收的更多相关文章

  1. Python垃圾回收机制--完美讲解!

    转自: http://www.jianshu.com/p/1e375fb40506 先来个概述,第二部分的画述才是厉害的. Garbage collection(GC) 现在的高级语言如java,c# ...

  2. python垃圾回收机制与小整数池

    python垃圾回收机制 当引用计数为0时,python会删除这个值. 引用计数 x = 10 y = x del x print(y) 10 引用计数+1,引用计数+1,引用计数-1,此时引用计数为 ...

  3. python垃圾回收机制:引用计数 VS js垃圾回收机制:标记清除

    js垃圾回收机制:标记清除 Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理 当变量进入环境时,将这个变量标记为"进入 ...

  4. python 垃圾回收

    # 垃圾回收 # 小整数对象池 # a = 100# python对小整数的定义是[-5,257],这些证书对象是提前创建好的,不会被垃圾回收,再一个python的程序中,所有位于这个范围内的正式使用 ...

  5. python垃圾回收

    python垃圾回收 python垃圾回收主要使用引用计数来跟踪和回收垃圾.在引用计数的基础上,通过“标记—清除”解决容器对象可能产生的循环引用问题,通过“分代回收”以空间换时间的方法提高垃圾回收效率 ...

  6. python垃圾回收机制(Garbage collection)

    由于面试中遇到了垃圾回收的问题,转载学习和总结这个问题. 在C/C++中采用用户自己管理维护内存的方式.自己管理内存极其自由,可以任意申请内存,但也为大量内存泄露.悬空指针等bug埋下隐患. 因此在现 ...

  7. python 垃圾回收详解

    原文:https://zhuanlan.zhihu.com/p/31150408 总纲 策略和垃圾回收系统工作内容 引用计数详解 标记-清除+分代收集 循环引用 编程应用-常见方法 ex 过程详解 使 ...

  8. python垃圾回收算法

    标准python垃圾回收器由两部分组成,即引用计数回收器和分代垃圾回收器(即python包中的gc module).其中,引用计数模块不能被禁用,而GC模块可以被禁用. 引用计数算法 python中每 ...

  9. python 垃圾回收笔记

    目录 引用计数 python内部的引用计数机制 循环引用 调试内存泄漏 总结 python 程序在运行的时候,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量:计算完成后,再将结果输出到永久性 ...

随机推荐

  1. C#的math类的全部运算方法

    Abs 返回指定数字的绝对值.Acos 返回余弦值为指定数字的角度.Asin 返回正弦值为指定数字的角度.Atan 返回正切值为指定数字的角度.Atan2 返回正切值为两个指定数字的商的角度.BigM ...

  2. bzoj2893(费用流)

    先缩点,然后拆点,其实是很经典的一种操作,把不好做的点拆成边,然后我一开始想的是网络流,答案当然是增广次数, 但可以发现跑网络流的话不同的跑法增广次数不一样,不太好找最小的.我们可以换一种神奇的思路, ...

  3. POJ2061 Subsequence 2017-05-25 19:49 83人阅读 评论(0) 收藏

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14709   Accepted: 6210 Desc ...

  4. Java 理论与实践: 用弱引用堵住内存泄漏

    弱引用使得表达对象生命周期关系变得容易了 虽然用 Java™ 语言编写的程序在理论上是不会出现“内存泄漏”的,但是有时对象在不再作为程序的逻辑状态的一部分之后仍然不被垃圾收集.本月,负责保障应用程序健 ...

  5. 锁——Java同步的基本思想

    翻译人员: 铁锚 翻译时间: 2013年11月13日 原文链接:  Monitors – The Basic Idea of Java synchronization 如果你上过操作系统课程,你就知道 ...

  6. uniGUI 通过SessionList操作另外的登录用户

    参照bbs,写了这个方法,检查是否有同名用户已经登录:procedure TUniMainModule.CheckSameUser(aUserLoginCode: string);var  ASess ...

  7. SQLSqlserver中如何将一列数据,不重复的拼接成一个字符串

    把一列数据拼接成一个字符串比较简单: declare @test varchar(500) set @test=''; select @test=@test+name+',' from person ...

  8. 定时任务 Wpf.Quartz.Demo.1

    Quartz 是个开源的作业调度框架. 安装:Install-Package Quartz 官网文档地址:https://www.quartz-scheduler.net/documentation/ ...

  9. 【kuangbin专题】计算几何_半平面交

    1.poj3335 Rotating Scoreboard 传送:http://poj.org/problem?id=3335 题意:就是有个球场,球场的形状是个凸多边形,然后观众是坐在多边形的边上的 ...

  10. Color the ball(HDU1556)树状数组

    每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...