惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
G
Google Developers Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
有赞技术团队
有赞技术团队
Vercel News
Vercel News
MongoDB | Blog
MongoDB | Blog
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
I
InfoQ
Blog — PlanetScale
Blog — PlanetScale
博客园_首页
The Cloudflare Blog
B
Blog
C
Check Point Blog
Stack Overflow Blog
Stack Overflow Blog
IT之家
IT之家
U
Unit 42
D
Docker
月光博客
月光博客
aimingoo的专栏
aimingoo的专栏
博客园 - Franky
A
About on SuperTechFans

郑文峰的博客

使用dify对接飞书多维表格 使用n8n对接飞书多维表格 服务启动时出现 OOM 一次服务升级时pg表DDL执行超时失败 Go语言高效IO缓冲技术详解 Go语言延迟初始化(Lazy Initialization)最佳实践 Go语言字符串拼接性能对比与优化指南 Go语言结构体内存对齐完全指南 Go语言空结构体:零内存消耗的高效编程 Go语言堆栈分配与逃逸分析深度解析 Go语言原子操作完全指南 Go语言内存预分配完全指南 Go语言不可变数据共享:无锁并发编程实践 Go语言零拷贝技术完全指南 Go语言遍历性能深度解析:从原理到优化实践 Go语言Interface Boxing原理与性能优化指南 Go协程池深度解析:原理、实现与最佳实践 使用etcd分布式锁导致的协程泄露与死锁问题 基于pre-commit的Python代码规范落地实践 初识 MCP Server pulsar阻塞导致logstash无法接入日志 django-prometheus使用及源码分析 kube-proxy源码分析 kubernetes service如何通过iptables转发 tcp缓存引起的日志丢失 django-apschedule定时任务异常停止 理解calico容器网络通信方案原理 理解flannel的三种容器网络方案原理 理解Linux IPIP隧道 理解VXLAN网络
python垃圾回收机制
zhengwenfeng · 2022-08-10 · via 郑文峰的博客

# 引用计数

每次对象被引用时,会被计数加1,当计数为0时,则回收该对象。

注意: 循环引用的情况,引用计数不能解决.

# 标记-清除

对所有活跃的对象进行标记,对非活跃对象进行回收。可以有效的解决循环引用的问题

原理 对象之间通过引用构建有向图,从root object(全局变量,寄存器等不可删除的对象)出发,沿着有向边遍历对象,可达的对象标记为活跃对象,不可达的对象就是要被清除的非活动对象。

在下图中,从黑点开始出发,1对象可达,2、3间接可达,1、2、3是活跃对象,4,5不可达,所以是非活跃对象,进行回收。 在这里插入图片描述

过程 找到root object集合, 在内存建立两条连表,一条链表维护root object集合,另一条链表哦维护剩下的对象,在标记的过程中,如果在不可达链表中存在被root链表中的独享,直接或间接引用独享,就将其从不可达链表移到root链表中。当完成标记后,不可达链表剩下的对象都是垃圾对象,进行回收。

# 分代回收

对象分在不同集合中,每个集合称为一个, Python中分为3代,年轻代(第0代)、中年代(第1代)、老年代(第二代),对应3各链表,每一代GC频率不同,第0代最高,第1代次之,第二代最低(越年轻的对象越容易死掉,而老的对象通常会存错更久),新生的对象放入第0代,如果该对象在第0代的一次GC中存活,则移动到第1代,如果第一代对象在第1代GC中存错,则移动到第2代。

什么情况触发GC, 可以设置阈值,也可以手动调用gc.collect()

每次扫描全部对象,费时费力,提高GC的效率。

# 垃圾回收触发情况

调用gc.collect(),需要先导入gc模块。

gc模块的计数器达到阈值的时候。阈值可以设置