百科狗-知识改变命运!
--

Python垃圾回收

百变鹏仔1年前 (2023-11-21)阅读数 22#技术干货
文章标签对象

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!!!

Python垃圾回收

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相关知识,请关注IT培训机构:开发教育。http://www.baikegou.com/

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)