垃圾回收

环状双向链表refchain

refchain的上一个对象
refchain的下一个对象
引用计数器:每个对象都有引用计数器,创建之后默认为1,引用的时候加1
类型

根据不同的类型创建不同的结构体:PyObject,PyVarObject

回收

将对象从refchain链表删除,将对象销毁,内存归还

标记清除

解决循环引用的问题
循环引用链表存放:list/tuple/dict/set

分代回收

将可以能存在循环引用的对象维护成3个链表:
0:对象到700扫描
1:0代扫描10次,1代扫描1次
2:1代扫描10次,2代扫描1次

总结

在python中维护了一个rechain的双向环状链表,这个链表存储创建的所有对象,每种类型的对象都具有一个引用计数器,默认为1,只要引用次数就加1,最后当引用计数器为0时进行垃圾回收(在rechain中删除,对象销毁)
但是当在list/tuple/set/dict这种由多个元素组成的对象可能会存在循环引用的问题,为了解决这个问题使用了标记清除和分代回收,其内部为4个链表:refchain,0代700个,1代是0代的10倍,2代是1代的10倍
当源码内部达到各自的阈值时,就会触发扫描链表进行标记清除操作,有循环则各自减1
普通对象用refchain,多个对象用refchain+3代

python缓存

为了避免重复创建和销毁一些常见对象,维护池
比如启动解释器时会先自动创建整型的相关对象,这样取得时候只需要从缓存池中取即可

v1 = 7
v2 = 6
v3 = 6
print(id(v1))
print(id(v2))
print(id(v3))

free_list

当一个对象得引用计数器为0时,按理说就应该直接回收,但是内部不会直接回收,而是将对象添加到free_list链表中当缓存,以后在创建对象时,不在重新开辟内存,而是直接使用free_list

v1 = 3.14 # 开辟内存,内部存储结构体中定义那几个值,并存到refchain中
del v1 # refchain中移除,在将对象添加到free_list中
v9 = 999.99 # 不会重新开辟内存,去free_list中获取对象,对象内部数据初始化,在放到refchain中

参考资料

https://www.bilibili.com/video/BV1dp4y1C7ja

Python垃圾回收和内存管理相关推荐

  1. .NET深入学习笔记(3):垃圾回收与内存管理

    今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...

  2. 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制

    今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...

  3. Python垃圾回收与内存泄露

    Python是面向对象.高级编程语言,其世界里万物皆对象,当我们编写的程序运行时,代码中定义的对象在物理内存中会占用相应的空间.现在流行的高级语言如Java,C#等都采用了垃圾收集机制自动管理内存使用 ...

  4. 【Python】学习笔记总结5(Python垃圾回收及内存优化)

    文章目录 五.Python垃圾回收 1.引用计数(主) 2.GC负责的主要任务 3.标记-清除 4.引用计数不能回收的案例分析 5.分代收集 6.GC的阈值 7.GC垃圾回收自动触发机制 7.内存优化 ...

  5. Java跨平台实现原理及JVM垃圾回收、内存管理实战

    对象已死?啊,难受-- 最近深陷排查各种内存溢出.内存泄漏的问题,不得不对垃圾回收器下手了,因为当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些"自动化"的技术实施必要的 ...

  6. NET学习笔记-3:垃圾回收与内存管理

    你清楚.Net的垃圾回收机制吗? 你能简述一下GC的工作原理吗? 怎么样才能有效的管理内存呢? Using语句体内实例化的对象有什么作用?等等相关问题. 本节的组织如下: 1..Net的类型和内存分配 ...

  7. python 释放变量所指向的内存_通俗易懂的Python垃圾回收机制及内存管理

    Python垃圾回收机制及内存管理 内存管理: 先定义一个变量 name='wxl' 那么python会在内存中开辟一小块区域存放"wxl",此时变量的值是我们真正想要存储的,wx ...

  8. 【Unity】Unity内存管理与优化(一)内存域、堆栈、垃圾回收、内存泄漏、内存碎片

    文章目录 Unity内存 内存域 - 托管域 - 本地域 - 外部库 - 跨桥操作 堆和栈 - 栈 - 堆 - 堆栈的使用 垃圾回收 - Mono内存分配过程 - 内存泄漏 - 内存碎片 - 运行时垃 ...

  9. python是不是特别垃圾-谈谈python垃圾回收机制

    什么是垃圾回收机制? 首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来. 在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾. ...

最新文章

  1. 项目整体管理:项目整体管理实现过程
  2. @hdu - 6372@ sacul
  3. Mosquitto安装及使用简介
  4. loadrunner取出字符串的后面几位
  5. 身份证号第18位的计算
  6. WebRequest中的工厂方法模式
  7. APP注册名称的一些问题
  8. 游戏设计模式——观察者模式(Observer)
  9. 解决 VS Code 卡顿 卡死 电脑变卡 CPU 运行高
  10. 基于Kappa-mu/M分布的联合多用户分集与并行中继继选择RF/FSO系统性能研究
  11. AWS VPC Peering Azure VNET Peering
  12. MySql服务器忘记密码? 这几步轻松重置密码。
  13. 远程监控 java_JAVA实现远程监控
  14. mac 10.13.5, texpad 1.7.40安装教程
  15. 消息队列之Kafka 再平衡问题(七)
  16. java 中的finally你知多少_「JAVA」详述Java异常体系,处理异常时配上finally效果更佳...
  17. javascript尾递归优化
  18. Java抽象类和接口的详细区别(全)
  19. Shoping~添加+修改+删除+批量删除
  20. 聊聊手机上使用的防抖技术

热门文章

  1. C++程序代码:类实现——【calculator】计算器程序设计
  2. 网络分裂(network partition)
  3. QT4 designer的使用 QT国际化
  4. SpringMVC之Controller和参数绑定
  5. 澳大利亚短租市场火爆 “祖母房”成为热搜
  6. BZOJ1877:[SDOI2009]晨跑——题解
  7. 万万没想到 过去一年 蚂蚁森林成了联合国会议上的“网红”
  8. 深入理解并行编程-分割和同步设计(五)
  9. 使用Elasticsearch,Kafka和Cassandra构建流式数据中心
  10. 2010年经典语录,我们全OUT了