python gc模块

gc模块提供一个接口给开发者设置垃圾回收的选项。采用引用计数的方法管理内存的一个缺陷是循环引用的问题,而gc模块的一个主要功能就是

解决循环引用的问题

常用函数:

1.gc.set_debug(flags)设置gc的debug日志,一般设置为gc.DEBUG_LEAK

2.gc.collect([generation])显式进行垃圾回收,可以输入参数,0代表只检查第一代的对象,1代表检查

一,二代的对象,2代表检查一,二,三代的对象,如果不传参数,执行一个full collection,也就是等于传2.

返回不可达(unreachable objects)对象的数目

3.gc.get_threshold()获取的gc模块中自动执行垃圾回收的频率

4.gc.set_threshold(threshold0[,threshold1[,threshold2])设置自动执行垃圾回收的频率

5.gc.get_count()获取当前自动执行垃圾回收的计数器,返回一个长度为3的列表

gc模块的自动垃圾回收机制

必须要import gc模块,并且 is_enable()=True 才会启动自动垃圾回收

这个机制的主要作用就是发现并处理不可达的垃圾对象

   垃圾回收=垃圾检查+垃圾回收 

在python中,采用分代收集的方法。把对象分为三代,一开始,对象在创建的时候,放在一代,如果在

一次一代的垃圾检查中,该对象存活下来,就会被放到二代中,同理在一次二代的垃圾检查中,该对象

存活下来,就会被放到三代中。

gc模块里面会有一个长度为3的列表的计数器,可以通过gc.get_count()获取

Python中的垃圾回收是以引用计数为主,分代收集为辅。

1.导致引用计数+1的情况

》对象被创建,例如a=23

》对象被引用,例如b=a

》对象被作为参数,传入到一个函数中,例如func(a)

》对象作为一个元素,存储在容器中,例如list1=【a,a】

2.导致引用计数-1的情况

》对象的别名被显式销毁,例如del a

》对象的别名被赋予新的对象,例如a=24

》一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)

》对象所在的容器被销毁,或从容器中删除对象

  1. 查看一个对象的引用计数

import sys

a = “hello world“

sys.getrefcount(a)

可以查看a对象的引用计数,但是比正常计数大1,因为调用函数的时候传入a,这会让a的引用计数+1

4.什么情况下触发python垃圾回收

》import gc

gc.get_threshold()

输出:(700,10,10) (当没有释放的对象个数超过700,即开始0级垃圾回收,0级垃圾回收超过10次即开始1级垃圾回收,1级垃圾回收清除包括0级垃圾,

                              1级垃圾回收超过10次,即开始2级垃圾回收,2级垃圾回收清除包括0级,1级垃圾)

》垃圾回收机制python默认开启的,gc.disabled可关闭垃圾回收机制,当程序完成时,垃圾最后仍被回收

》当gc.disabled时,gc.collect手动开启垃圾回收机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值