前言
通过上文我们知道,python有2种机制来减少垃圾检测的频率,并以此提高运算的性能。
如有需要请查看文章:
【python 分代回收机制】
https://blog.csdn.net/qq_40883524/article/details/131947749?spm=1001.2014.3001.5502
另外我们知道,python会自动进行垃圾检测并进行释放回收,我们是否能主动触发垃圾回收呢?下面介绍自动回收 or 手动回收两种方式
自动回收
gc.enable() # 开启垃圾回收(默认开启)
gc.disable() # 关机垃圾回收
gc.isenabled() # 判断是否开启
触发条件:
- 开启垃圾回收机制(默认开启)
- 并且达到垃圾回收阈值
阈值介绍:
垃圾回收器当中,新增的对象个数-消亡的对象个数,达到一定的阈值时,才会触发垃圾检测;
注意:
这里的垃圾回收开启仅是针对垃圾回收机制,而不针对引用计数器,当关闭垃圾回收机制,引用计数器机制会正常生效,引用计数器生效的原理是当计数为0时自动释放
简单验证:
import gc
import objgraph
# 关闭垃圾回收机制,引用计数器机制正常生效,垃圾正常被回收
gc.disable()
class Animal:
pass
class Person:
pass
p = Person()
dog = Animal()
# p.pet = dog
# dog.master = p
del p
del dog
print(objgraph.count("Person")) #0
print(objgraph.count("Animal"))#0
手动回收
方式1:手动修改阈值
import gc
import objgraph
class Animal:
pass
class Person:
pass
p = Person()
dog = Animal()
p.pet = dog
dog.master = p
del p
del dog
# 上面是循环引用的经典场景,引用计数器无法进行回收
# 需要使用垃圾回收机制进行检测并且清理
# 虽然垃圾回收是默认打开的,但是需要达到阈值才会进行回收
# 手动修改阈值
gc.set_threshold(1,10,10)
# 发现已被回收
print(objgraph.count("Person")) # 0
print(objgraph.count("Animal")) # 0
方式2
import gc
import objgraph
class Animal:
pass
class Person:
pass
p = Person()
dog = Animal()
p.pet = dog
dog.master = p
del p
del dog
# 上面是循环引用的经典场景,引用计数器无法进行回收
# 需要使用垃圾回收机制进行检测并且清理
# 虽然垃圾回收是默认打开的,但是需要达到阈值才会进行回收
# 运行垃圾收集器
# 注:触发垃圾回收的时候,并不关心垃圾回收机制收否打开
gc.collect()
# 发现已被回收
print(objgraph.count("Person"))
print(objgraph.count("Animal"))
0
0
collect()源码:
"""
def collect(*args, **kwargs): # real signature unknown
Run the garbage collector.
With no arguments, run a full collection. The optional argument
may be an integer specifying which generation to collect. A ValueError
is raised if the generation number is invalid.
The number of unreachable objects is returned.
pass
"""
总结
我们可以选择手动修改阈值或者使用手动的触发垃圾回收,前者修改阈值(达到要求)可以直接进行回收,而后者使用gc.collect()方法可以直接进行回收