python 垃圾回收时机

前言

通过上文我们知道,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()方法可以直接进行回收

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值