Python中gc模块封装了许多和对象以及垃圾回收相关的方法

导致引用计数+1的情况:

  • 对象被创建,并被一个对象所引用。比如a=23
  • 对象被另一个对象引用。比如b=a
  • 对象作为函数的参数。比如func(a)
  • 对象被添加到容器中,比如添加到列表,元组,字典,集合等。比如temp=[a]

导致引用计数-1的情况:

  • 引用变量的对象被删除
  • 对象的变量被指向其他对象
  • 函数执行完毕,比如临时变量
  • 对象所在的容器被销毁

查看一个对象的引用计数:

打印出来的值就是引用计数,但是会比真实的值多1,因为getrefcount也引用了这个对象,这个过程会导致计数多1

gc模块的常用函数:

  • gc.set_debug(flags): 设置gc的debug日志,一般设置为gc.DEBUG_LEAK可以看到内存泄漏的对象。
  • gc.collect(generation):手动执行垃圾回收。会将那些有循环引用的对象给回收了。这个函数可以传递参数,0代表只回收第0代的的垃圾对象、1代表回收第0代和第1代的对象,2代表回收第0、1、2代的对象。如果不传参数,那么会使用2作为默认参数。

返回的3个值分别是:差值,遍历零代链表次数,遍历一代链表次数

  • gc.get_threshold():获取gc模块执行垃圾回收的阈值。返回的是个元组,第0个是零代的阈值,第1个是1代的阈值,第2个是2代的阈值。
  • gc.set_threshold():设置执行垃圾回收的阈值。
  • gc.get_count():获取当前自动执行垃圾回收的计数器。返回一个元组。第0个是零代的垃圾对象的数量,第1个是零代链表遍历的次数,第2个是1代链表遍历的次数。

注:如果开发者自己写了__del__函数,导致了循环引用,那么将不会进行垃圾回收,所以尽量不要写__del__函数