垃圾回收算法
- 引用计数(自动)- 不能解决循环引用
- 标记清除 - 解决循环引用( 调用gc.collect() )
- 分代收集(三代)
del object
gc.collect()
内存池机制
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
Python小整数对象池的范围是[-5, 256],这些整数对象都是提前创建好的,在这个范围内的整数独占内存,不会被垃圾回收。
intern机制
a = "HelloPython"
b = "HelloPython"
c = "HelloPython"
类似这样的,Python去不会创建3个字符串对象,而是会默认开启intern机制,将这三个对象指向同一个内存空间,节省内存开销。
引用计数
Python中,每一个东西都是对象,底层实现中都是一个PyObject。
typedef struct_object {
int ob_refcnt;
struct_typeobject *ob_type;
} PyObject;
引用计数增加一的方法
- 对象被创建
- 对象被引用
- 对象作为参数传入函数
- 对象作为元素存储在容器中
引用计数减少一的方法
- 对象的别名显示销毁,del object
- 对象的别名被赋予新对象
- 对象离开作用域
- 对象所在的容器被销毁,或从容器中被删除
触发垃圾回收
- gc.collect()
- gc模块的计数器达到阈值
- 程序退出
gc模块常用函数
gc.set_debug(flags)
设置gc的debug日志,一般设置为gc.DEBUG_LEAK
gc.collect([generation])
显式进行垃圾回收,可以输入参数,0代表只检查第一代的对象,1代表检查一,二代的对象,2代表检查一,二,三代的对象,如果不传参数,执行一个full collection,也就是等于传2。返回不可达(unreachable objects)对象的数目。
gc.set_threshold(threshold0[, threshold1[, threshold2])
设置自动执行垃圾回收的频率。
gc.get_count()
获取当前自动执行垃圾回收的计数器,返回一个长度为3的列表
参考
http://c.biancheng.net/view/5540.html
https://testerhome.com/topics/16556
https://baijiahao.baidu.com/s?id=1625794283727801503&wfr=spider&for=pc
https://www.jianshu.com/p/c608dee78ec8
https://blog.csdn.net/qq_38260497/article/details/87877823
https://blog.csdn.net/xiongchengluo1129/article/details/80462651
https://www.cnblogs.com/alexzhang92/p/9416692.html