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函数中的局部变量(全局变量不会)

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


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


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手动开启垃圾回收机制

 







你可能感兴趣的:(python gc模块)