当引⽤计数为0时,该对象⽣命就结束了。
引⽤计数机制的优点:
1、简单
2、实时性:⼀旦没有引⽤,内存就直接释放了。不⽤像其他机制等到特定时机。实时性还带来⼀个好处:处理回收内存的时间分摊到了平时。
引⽤计数机制的缺点:
1、维护引⽤计数
2、消耗资源循环引⽤
list1 = []
list2 = []
list1.append(list2)
list2.append(list1)
list1与list2相互引⽤,如果不存在其他对象对他们的引用,list1与list2的引用计数也仍然1,所占⽤的内存永远无法被回收,这将是致命的。 对于如今的强⼤硬件,缺点1尚可接受,但是循环引⽤导致内存泄露,注定python还将引⼊新的回收机制。(分代收集)
⼀.垃圾回收机制
Python中的垃圾回收是以引用计数为主,分代收集为辅。
1、导致引用计数+1的情况
对象被创建,例如a=23
对象被引⽤,例如b=a
对象被作为参数,传⼊到⼀个函数中,例如func(a)
对象作为⼀个元素,存储在容器中,例如list1=[a,a]
2、导致引用计数-1的情况
对象的别名被显式销毁,例如del a
对象的别名被赋予新的对象,例如a=24
⼀个对象离开它的作⽤域,例如f函数执⾏完毕时,func函数中的局部变量(全局变量不会)
对象所在的容器被销毁,或从容器中删除对象
3、查看一个对象的引用计数
import sys
a = "hello world"
sys.getrefcount(a)
可以查看a对象的引用计数,但是⽐正常计数⼤1,因为调⽤函数的时候传入a,这会让a的引用计数+1
4.有三种情况会触发垃圾回收:
当gc模块的计数器达到阀值的时候,自动回收垃圾
调⽤gc.collect(),手动回收垃圾
程序退出的时候,python解释器来回收垃圾
网友评论