以后都在 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, 一个