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

推荐订阅源

D
Docker
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
A
About on SuperTechFans
博客园 - 【当耐特】
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
雷峰网
雷峰网
博客园_首页
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
博客园 - 叶小钗
Google DeepMind News
Google DeepMind News
aimingoo的专栏
aimingoo的专栏
博客园 - 聂微东
B
Blog RSS Feed
H
Help Net Security
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
L
LangChain Blog
Vercel News
Vercel News

郑文峰的博客

使用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模块的计数器达到阈值的时候。阈值可以设置