python 的垃圾回收机制(Garbage Collection)

本文介绍了Python的垃圾回收机制,包括引用计数器和分代回收。引用计数器适用于大部分情况,而分代回收机制能处理引用循环等复杂情况。Python将存活对象分为三代,回收频率由低到高。此外,文章还提到了__del__函数的特殊行为及其在不同Python版本中的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以后都在 github 更新,请参考 python 垃圾回收

 

最近读了一些关于 Python 内部实现的博客,其中有几篇关于 Garbage Collection 的,在此分享一下

对于比较小块的内存(比如小于等于512bytes), 当你认为这个对象所占的内存需要被解释器回收时,解释器实际上不会对这块内存进行回收,而是保留起来,下次使用。这有点像 C++ 的默认的 std::allocator, C++ 默认的 std::allocator 会初始化一个链表,每个链表里面的对象都指向一段和操作系统申请的内存块,当你需要一个比较小的内存块时,直接从这个链表里找一块未被使用过的给你,并标记为使用中。这样做可以避免内存碎片,还有频繁的和操作系统申请内存,频繁的向操作系统申请内存是非常影响性能的。

我估计 Python 解释器的内存管理也使用了类似的方案,回头再来研究,这里讨论的是内存回收机制。

Python 主要使用以下两种方法进行内存回收:

1. 引用计数器(Reference Counting)

在Python中,所有你赋值/创建的变量都是指向这个真正的对象的引用,每一次赋值,引用数就会加一,每次这个变量销毁,这个真正的对象的引用数就会减一,当引用数变为0的时候,这个真正的对象就会被解释器的 Garbage Collector 回收, 达到释放内存的目的。

如果这个对象还含有指向其他对象的引用,那么这些被指向的其他对象的引用计数器都会减一(比如列表中含有好几个元素, 如果列表被删除,列表中的这些元素都会删除该索引)

import sys
a = []
# 一个来自变量a, 一个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值