首页 / 知识
Python垃圾回收
2023-11-12 13:39:00
Python垃圾回收包括引用计数、标记清除和分代回收
引用计数
引用计数是一种垃圾收集机制,当一个python对象被引用时,引用计数加1,当一个对象的引用为0时,该对象会被当做垃圾回收。
fromsysimportgetrefcount
l1=[1,2,3]
print(getrefcount(l1))#查看引用计数
l2=l1
print(getrefcount(l2))
执行结果:
2
3
在使用getrefcount()的时候,变量作为参数传进去,会多一次引用。
del语句会删除对象的一个引用。请看下面的例子:
fromsysimportgetrefcount
classTestObjectA():
def__init__(self):
print("hello!!!")
def__del__(self):
print("bye!!!")
a=TestObjectA()
b=a
c=a
print(getrefcount(c))
dela
print(getrefcount(c))
delb
print(getrefcount(c))
delc
print("666")
执行结果:
hello!!!
4
3
2
bye!!!
666
方法__del__的作用是当对象被销毁时调用。其中dela删除了变量a,但是对象TestObjectA仍然存在,它还被b和c引用,所以不会被回收,引用计数为0时会被回收。上面的例子中,将a,b,c都删除后引用的对象被回收(打印“666”之前)。
另外重新赋值也会删除对象的一个引用。
标记清除
如果出现了循环引用,引用计数方法就无法回收,导致内存泄漏。先来看下面的例子:
classTestObjectA(dict):
def__init__(self):
print("A:hello!!!")
def__del__(self):
print("A:bye!!!")
classTestObjectB(dict):
def__init__(self):
print("B:hello!!!")
def__del__(self):
print("B:bye!!!")
a=TestObjectA()
b=TestObjectB()
a['1']=b
b['1']=a
dela
delb
print("666")
执行结果:
A:hello!!!
B:hello!!!
666
A:bye!!!
B:bye!!!
上面的代码存在循环引用,删除a和b之后,它们的引用计数还是1,仍然大于0,不会被回收(打印“666”之后)。
标记清除可解决循环引用问题,从根对象(寄存器和程序栈上的引用)出发,遍历对象,将遍历到的对象打上标记(垃圾检测),然后在内存中清除没有标记的对象(垃圾回收)。上面的例子中,a和b相互引用,如果与其他对象没有引用关系就不会遍历到它,也就不会被标记,所以会被清除。
分代回收
如果频繁进行标记清除会影响Python性能,有很多对象,清理了很多次他依然存在,可以认为,这样的对象不需要经常回收,也就是说,对象存在时间越长,越可能不是垃圾。
将回收对象进行分代(一共三代),每代回收的时间间隔不同,其中新创建的对象为0代,如果一个对象能在第0代的垃圾回收过程中存活下来,那么它就被放入到1代中,如果1代里的对象在第1代的垃圾回收过程中存活下来,则会进入到2代。
gc模块
以下三种情况会启动垃圾回收:
·调用gc.collect():强制对所有代执行一次回收
·当gc模块的计数器达到阀值的时候。
·程序退出的时候
gc模块函数:
·gc.enable():启用自动垃圾回收
·gc.disable():停用自动垃圾回收
·gc.isenabled():如果启用了自动回收则返回True。
·gc.collect(generation=2):不设置参数会对所有代执行一次回收
·gc.set_threshold(threshold0[,threshold1[,threshold2]]):设置垃圾回收阈值
·gc.get_count():当前回收计数
·垃圾回收启动的默认阈值
importgc
print(gc.get_threshold())
输出:
(700,10,10)
700是垃圾回收启动的阈值,对象分配数量减去释放数量的值大于700时,就会开始进行垃圾回收,每10次0代垃圾回收,会导致一次1代回收;而每10次1代的回收,才会有1次的2代回收。可以使用set_threshold()方法重新设置。
以上内容为大家介绍了Python垃圾回收,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
为何你的Python代码应是扁平与稀疏
为何你的Python代码应是扁平与稀疏的,代码,培训,信息,观察,设计,工具,嵌套,闻闻,程序员,沉思,Python之禅之所以得名,正是由于它那简明扼要的规Python集合和时间复杂度
Python集合和时间复杂度,项目,时间,数据,数字,照片,情况,通用,培训,平均,表示,在本文的这一部分中,我将记录CPython中的常见集合,然后概述它们列举Python面向对象中带双下划线的
列举Python面向对象中带双下划线的特殊方法,信息,代码,培训,对象,属性,方法,实例,字符串,里边,内容,__new__:生成实例__init__:生成实例的属性_Python面向对象的基本概念
Python面向对象的基本概念,概念,信息,位置,新增,培训,属性,鸟类,定义,对象,方法,python使用类(class)和对象(object),进行面向对象(object-oripython阅读代码有助于养成优秀的代
python阅读代码有助于养成优秀的代码风格,代码,培训,统一,项目,名字,风格,注释,可读性,顾名思义,成份,“优秀的代码不需要文档”,这句话虽然说Python 条件对象
Python 条件对象,状态,培训,对象,条件,线程,方法,底层,发生,场景,典型,条件对象总是与某种类型的锁对象相关联,锁对象可以通过传入获得,或者在Python 事件对象
Python 事件对象,通信,培训,线程,事件,对象,内部,标志,信号,机制,以上,一个线程发出事件信号,其他线程等待该信号,这是最简单的线程之间通信机Python之什么是面向对象?
Python之什么是面向对象?,设计,流程,代码,个体,大唐,对比,培训,模子,上帝,对象,OOP(ObjectOrientedPrograming)编程是利用“类”和“对象”来Python垃圾回收机制
Python垃圾回收机制,时间,系统,工作,情况,技术,实时,培训,垃圾,对象,内存,pythonGC主要使用引用计数(referencecounting)来跟踪和回收垃圾。python获取当前时间日期有哪些方法
python获取当前时间日期有哪些方法?,时间,标准,星期六,培训,日期,微秒,结果,模块,星期,格式,获取到时间也是我们在学习python遇到的常见问题,如何在python代码中指定保存的文件
如何在python代码中指定保存的文件格式,代码,培训,文件格式,格式,二进制文件,文件,后缀,以上,方法,更多,python指定保存文件格式的方法:1、保python如何获取程序执行时间?
python如何获取程序执行时间?,代码,培训,标准,程序,方法,中间,使用方法,以上,手册,更多,python获取程序执行时间的方法:1、使用time.clock()方