1.垃圾回收机制
垃圾回收机制(Garbage Collection:GC)基本是所有高级语言的标准配置之一了,在一定程度上,能优化编程语言的数据处理效率和提高编程软件开发软件的安全性能
在python中的垃圾回收机制主要是以引用计数为主要手段
以标记清除和隔代回收机制作为辅助操作手段
完成对内存中无效数据的自动管理操作的!
1.1 引用计数
引用计数【Reference Counting:RC】是python中的垃圾回收机制的核心操作算法,该算法最早是George E.Collins 在1960年首次提出的,并在大部分高级语言中沿用至今,是很多高级语言的垃圾回收核心算法之一
(1)什么是引用计数
引用计数算法的核心思想是:当一个对象被创建或者拷贝时:引用计数就会+1,当这个对象的多个引用变量,被销毁一个时该对象的引用计数就会-1,如果一个对象的引用计数为0则表示该对象已将不被引用,就可以让垃圾回收机制进行清除并释放该对象占有的内存空间了。
引用计数算法的优点是:操作简单,实时性能优秀,能在最短的时间获得并运算对象引用数
引用计数算法的缺点是:为了维护每个对象的引用计数操作算法,python必须提供和对象对等的内存消耗来维护引用计数,这样就在无形中增加了内存负担:同时引用计数对于循环应用/对象之间的互相引用。是无法进行计数操作的,所以就会造成常驻内存的情况。
(2)pyhton中的引用计数
python是一个面向对象的弱类型语言,所有的对象都是直接或者间接继承自object类型,object类型的核心其实就是一个结构体对象
typedef struct_object{
int ob_refcnt;
struct_typeobject *ob_type;
}PyObject;
在这个结构体中,ob_refcnt 就是对象的引用计数,当对象被创建或者拷贝时该计数就会增加+1,当对象的引用变量被删除时,该计数就会减少-1,当引用计数为0时,对象数据就会被回收释放了。在python中,可以通过sys.getrefcount()来获取一个对象的引用计数
(3)标记清除
python中的标记--清除机制主要是针对可能产生循环引用的对象进行的检测机制
在python中的基本不可变类型如Pyintobject, pystringobject 等对象的内部不会内聚其他对象的引用,所以不会产生循环引用,一般情况下循环引用总是发生在其他可变对象的内部属性中,如list,dict,class等等,使得该方法消耗的资源和程序中可变对象的数量息息相关!
标记清楚算法核心思想:首先找到python中的一批根节点对象,如object对象,通过根节点对象可以找到他们指向的子节点对象,如果搜索过程中有这个指向是从上往下的指向,表示这个对象是可达的,否则该对象是不可达的,可达部分的对象在程序中需要保留下来,不可达部分的对象在程序中是不需要保留的
(4)分代回收
pyhton中的分代回收机制,是一种通过空间换区事件效率的做法,python内部处理机制定义了三个不同的链表数据结构【第零代(年轻代),第1代(中年代),第2代(老年代)】pyhton为了提高程序执行效率,将垃圾回收机制进行了阈值限定,0代链表中的垃圾回收机制执行最为密集,其次是1代,最后是2代:
一次类推知道一部分对象存回在第2代对象链表中,对象周期较长的可能跟程序的生命周期一样了。
备注:弱代假说:程序中年轻的对象往往死的更快,年老的对象往往存活更久
(5)垃圾回收处理
PYTHON 中的垃圾回收机制有了一定的了解之后,我们针对垃圾回收机制的操作通过代码进
行测试
PYTHON 中的 gc 模块提供了垃圾回收处理的各项功能机制,必须 import gc 才能使用
gc.set_debug(flags):设置 gc 的 debug 日志,一般为 gc.DEBUG_LEAK
gc.collect([generation]):显式进行垃圾回收处理,可以输入参数~参数表示回收的对
象代数,0 表示只检查第 0 代对象,1 表示检查第 0、1 代对象,2 表示检查 0、1、2 代独
对象,如果不传递参数,执行 FULL COLLECT,也就是默认传递 2
gc.set_threshold(threshold0 [, threshold2 [, threshold3]]):设置执行垃圾回
收机制的频率
gc.get_count():获取程序对象引用的计数器
gc.get_threshold():获取程序自动执行 GC 的引用计数阈值
以上是 PYTHON 中垃圾回收机制的基本操作,在程序开发过程中需要注意:
⚫ 项目代码中尽量避免循环引用
⚫ 引入 gc 模块,启用 gc 模块自动清理循环引用对象的机制