垃圾回收是一种自动管理内存的机制,目标是检测和回收不再被程序使用的内存,以达到避免内存泄漏和提高程序性能。python使用的是一种被称为引用计数的垃圾回收机制,以及一个循环垃圾回收器(cycle collector)来处理一些引用环的情况。
引用计数:
每个对象都有一个引用计数,当一个对象被引用时计数加一,当引用失效时计数减一。当计数降为零时,说明没有任何引用指向该对象,垃圾收集器就会回收这部分内存。
a = [1, 2, 3] #引用计数为1
b = a #引用计数为2
c = b #引用计数为3
b = 42 #引用计数减一,为2
c = "spam" #引用计数减一,为1
#当a, b, c都不再引用原列表时,该列表的引用计数降为零,会被回收
循环垃圾回收器:
引用计数不能解决循环引用的问题。循环引用是指一组对象彼此之间存在环形引用,这使引用计数永远不会降为零。循环垃圾回收器就会检测这种情况,并主动清理循环引用的对象。
#循环引用
class Node:
def __init__(self):
self.next = None
a = Node()
b = Node()
a.next = b
b.next = a
#这种情况无法通过引用计数回收,因为引用计数永远不为零