Python的垃圾回收机制(引用计数)

引用计数

Python语言默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早George E. Collins在1960的时候首次提出,50年后的今天,该算法依然被很多编程语言使用。

『引用计数法』的原理是:每个对象维护一个ob_ref字段,用来记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数ob_ref减1,一旦对象的引用计数为0,该对象立即被回收,对象占用的内存空间将被释放。

它的缺点是需要额外的空间维护引用计数,这个问题是其次的,不过最主要的问题是它不能解决对象的“循环引用”,因此,也有很多语言比如Java并没有采用该算法做来垃圾的收集机制。

什么是循环引用?a和b相互引用而再没有外部引用a与b中的任何一个,它们的引用计数虽然都为1,但显然应该被回收,例子:

a = { } #对象a的引用计数为 1
b = { } #对象b的引用计数为 1
a['b'] = b  #b的引用计数增1
b['a'] = a  #a的引用计数增1
del a #a的引用减 1,最后a对象的引用为 1
del b #b的引用减 1, 最后b对象的引用为 1

 在这个例子中程序执行完del语句后,a、b对象已经没有任何引用指向这两个对象,但是这两个对象各包含一个对方对象的引用,虽然最后两个对象都无法通过其它变量来引用这两个对象了,这对GC来说就是两个非活动对象或者说是垃圾对象,但是他们的引用计数并没有减少到零。因此如果是使用引用计数法来管理这两对象的话,他们并不会被回收,它会一直驻留在内存中,就会造成了内存泄漏(内存空间在使用完毕后未释放)。

上一篇:element-ui表格实现选中删除功能


下一篇:Python list列表常用方法及其底层实现