Python的垃圾回收机制

垃圾回收算法
  • 引用计数(自动)- 不能解决循环引用
  • 标记清除 - 解决循环引用( 调用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值