Python垃圾回收和内存管理
垃圾回收
环状双向链表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垃圾回收和内存管理相关推荐
- .NET深入学习笔记(3):垃圾回收与内存管理
今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...
- Python垃圾回收与内存泄露
Python是面向对象.高级编程语言,其世界里万物皆对象,当我们编写的程序运行时,代码中定义的对象在物理内存中会占用相应的空间.现在流行的高级语言如Java,C#等都采用了垃圾收集机制自动管理内存使用 ...
- 【Python】学习笔记总结5(Python垃圾回收及内存优化)
文章目录 五.Python垃圾回收 1.引用计数(主) 2.GC负责的主要任务 3.标记-清除 4.引用计数不能回收的案例分析 5.分代收集 6.GC的阈值 7.GC垃圾回收自动触发机制 7.内存优化 ...
- Java跨平台实现原理及JVM垃圾回收、内存管理实战
对象已死?啊,难受-- 最近深陷排查各种内存溢出.内存泄漏的问题,不得不对垃圾回收器下手了,因为当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些"自动化"的技术实施必要的 ...
- NET学习笔记-3:垃圾回收与内存管理
你清楚.Net的垃圾回收机制吗? 你能简述一下GC的工作原理吗? 怎么样才能有效的管理内存呢? Using语句体内实例化的对象有什么作用?等等相关问题. 本节的组织如下: 1..Net的类型和内存分配 ...
- python 释放变量所指向的内存_通俗易懂的Python垃圾回收机制及内存管理
Python垃圾回收机制及内存管理 内存管理: 先定义一个变量 name='wxl' 那么python会在内存中开辟一小块区域存放"wxl",此时变量的值是我们真正想要存储的,wx ...
- 【Unity】Unity内存管理与优化(一)内存域、堆栈、垃圾回收、内存泄漏、内存碎片
文章目录 Unity内存 内存域 - 托管域 - 本地域 - 外部库 - 跨桥操作 堆和栈 - 栈 - 堆 - 堆栈的使用 垃圾回收 - Mono内存分配过程 - 内存泄漏 - 内存碎片 - 运行时垃 ...
- python是不是特别垃圾-谈谈python垃圾回收机制
什么是垃圾回收机制? 首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来. 在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾. ...
最新文章
- 项目整体管理:项目整体管理实现过程
- @hdu - 6372@ sacul
- Mosquitto安装及使用简介
- loadrunner取出字符串的后面几位
- 身份证号第18位的计算
- WebRequest中的工厂方法模式
- APP注册名称的一些问题
- 游戏设计模式——观察者模式(Observer)
- 解决 VS Code 卡顿 卡死 电脑变卡 CPU 运行高
- 基于Kappa-mu/M分布的联合多用户分集与并行中继继选择RF/FSO系统性能研究
- AWS VPC Peering Azure VNET Peering
- MySql服务器忘记密码? 这几步轻松重置密码。
- 远程监控 java_JAVA实现远程监控
- mac 10.13.5, texpad 1.7.40安装教程
- 消息队列之Kafka 再平衡问题(七)
- java 中的finally你知多少_「JAVA」详述Java异常体系,处理异常时配上finally效果更佳...
- javascript尾递归优化
- Java抽象类和接口的详细区别(全)
- Shoping~添加+修改+删除+批量删除
- 聊聊手机上使用的防抖技术
热门文章
- C++程序代码:类实现——【calculator】计算器程序设计
- 网络分裂(network partition)
- QT4 designer的使用 QT国际化
- SpringMVC之Controller和参数绑定
- 澳大利亚短租市场火爆 “祖母房”成为热搜
- BZOJ1877:[SDOI2009]晨跑——题解
- 万万没想到 过去一年 蚂蚁森林成了联合国会议上的“网红”
- 深入理解并行编程-分割和同步设计(五)
- 使用Elasticsearch,Kafka和Cassandra构建流式数据中心
- 2010年经典语录,我们全OUT了