Python—垃圾回收机制

如果不垃圾回收会发生什么问题?——内存泄漏

  • 不再使用的内存会被一种称为垃圾回收的机制释放

  • python的垃圾回收机制实际上是一个引用计数器+一个循环垃圾收集器来工作

  • 垃圾回收器是一段独立的代码,用来寻找引用计数为0的对象

  • 垃圾回收器还负责检查虽然引用计数>0但也应该被销毁的对象——循环引用

  • 循环引用发生在至少有两个对象互相作用,垃圾回收器也会清理为引用的循环

  • python解释器会跟踪对象的引用计数,垃圾回收器负责释放内存

 

增加引用计数:
  • 对象被创建或者将其引用赋值,引用计数就被设置为1
  1. 对象被创建
  2. 另外的别名被创建
  3. 被作为参数传递给函数
  4. 成为容器对象的第一个元素
减少引用计数:
  • 当对象的引用被销毁时,引用计数就会减少
  1. 本地引用离开了作用范围’
  2. 对象的别名被显示销毁
  3. 对象的一个别名被赋值给其他对象
  4. 对象被从一个窗口对象中移除
  5. 窗口对象本身被销毁
 1 import sys
 2 print(sys.getrefcount(5001111))
 3 a = 5001111
 4 print(sys.getrefcount(5001111))
 5 b = a #增加引用,<5001111>的计数
 6 print(sys.getrefcount(5001111))
 7 c = [b] #增加引用,<5001111>的计数
 8 print(sys.getrefcount(5001111))
 9 def A(a):
10     print('in A, count:', sys.getrefcount(a))
11 print('pre A, count:', sys.getrefcount(a))
12 #一个函数A的参数a的引用,再一个是函数栈保存了入参对a的引用
13 A(a)
14 print('end A, count:', sys.getrefcount(a))
15 #函数引用完之后减少引用计数
16 del a #减少引用<5001111>的计数
17 print(sys.getrefcount(5001111))
18 b = 100 #减少引用<5001111>的计数
19 print(sys.getrefcount(5001111))
20 c[0] = -1  #减少引用<5001111>的计数
21 print(sys.getrefcount(5001111))

 

输出结果

 

__del__语句:

析构方法,当对象在内存中被释放时,自动触发执行

注:此方法一般无须定义,因为python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

 

 

 

 

 

posted @ 2021-12-07 16:12  人机97  阅读(88)  评论(0)    收藏  举报