2025年Python:gc模块使用和垃圾回收机制

Python:gc模块使用和垃圾回收机制简介 gc 模块即 Python 中垃圾回收模块 它提供可选的垃圾回收器的接口 同时提供对回收器找到但是无法释放的不可达对象的访问 由于 Python 使用了带有引用计数的回收器 如果你确定你的程序不会产生循环引用 你可以关闭回收器 可以通过调用 gc disable 关闭自动垃圾回收 Python 中垃圾回收

大家好,我是讯享网,很高兴认识大家。

简介:gc模块即Python中垃圾回收模块,它提供可选的垃圾回收器的接口。同时提供对回收器找到但是无法释放的不可达对象的访问。由于 Python 使用了带有引用计数的回收器,如果你确定你的程序不会产生循环引用,你可以关闭回收器。可以通过调用 gc.disable() 关闭自动垃圾回收。

Python中垃圾回收:
python的垃圾回收器把所有对象分类为三代,其依据是对象在多少次垃圾回收后幸存。新建对象会被放在最年轻代(第 0 代)。如果一个对象在一次垃圾回收后幸存,它会被移入下一个较老代。由于第 2 代是最老代,这一代的对象在一次垃圾回收后仍会保留原样。为了确定何时要运行,垃圾回收器会跟踪自上一次回收后对象分配和释放的数量。当分配数量减去释放数量的结果值大于 threshold0 时,垃圾回收就会开始。初始时只有第 0 代会被检查。如果自第 1 代被检查后第 0 代已被检查超过 threshold1 次,则第 1 也会被检查。对于第三代来说情况还会更复杂。

图解分代回收:
图片
讯享网

提供的功能包括:
1、关闭收集器
2、调整收集频率
3、设置调试选项

主要方法:

enable() --启用自动垃圾回收。 disable() --禁用自动垃圾回收。 isenabled() --如果启用了自动收集,则返回true。 collect() --立即执行完全收集。 get_count() --返回当前集合计数。 get_stats() --返回包含每代统计信息的词典列表。 set_debug() --设置调试标志。 get_debug() --获取调试标志。 set_threshold() --设置收集阈值。 get_threshold() --返回集合阈值的当前值。 get_objects() --返回收集器跟踪的所有对象的列表。 is_tracked() --如果跟踪给定对象,则返回true。 is_finalized() --如果给定对象已定稿,则返回true。 get_referrers() --返回引用对象的对象列表。 get_referents() --返回对象引用的对象列表。 freeze() --冻结所有跟踪对象,并在将来的收集中忽略它们。 unfreeze() --解冻永久生成中的所有对象。 get_freeze_count() --返回永久生成中的对象数。 

讯享网

最常用的方法:gc.collect() --立即执行完全收集,释放出不使用的资源,归还内存。可以通过参数generation,单独对0,1,2代进行回收释放。

单独对特定代收集:

讯享网import gc gc.collect(generation=0) gc.collect(generation=1) gc.collect(generation=2) 

案例源码:

import subprocess, psutil, gc mem1 = psutil.virtual_memory() print(f"某程序前内存已使用:{ 
     mem1.used}") print(f"某程序前内存剩余:{ 
     mem1.free}") print(f"某程序前内存百分比:{ 
     mem1.percent}") app1 = subprocess.Popen(r'D:\IntelliJ IDEA Community Edition 2020.1.2\bin\idea64.exe') app2 = subprocess.Popen(r'D:\IntelliJ IDEA Community Edition 2020.1.2\bin\idea64.exe') app3 = subprocess.Popen(r'D:\IntelliJ IDEA Community Edition 2020.1.2\bin\idea64.exe') mem2 = psutil.virtual_memory() print(f"某程序后内存已使用:{ 
     mem2.used}") print(f"某程序后内存剩余:{ 
     mem2.free}") print(f"某程序后内存百分比:{ 
     mem2.percent}") app1.kill() app2.kill() app3.kill() gc.collect() mem3 = psutil.virtual_memory() print(f"GC回收后内存已使用:{ 
     mem3.used}") print(f"GC回收后内存剩余:{ 
     mem3.free}") print(f"GC回收后内存百分比:{ 
     mem3.percent}") 

执行收集前后内存变化:
图片

需要注意的是:执行收集本身也需要一点的内存代价,所以可能存在收集完成后内存反而增加的情况。
图片

微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!

小讯
上一篇 2025-03-10 16:19
下一篇 2025-03-21 11:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/60019.html