不得不知道的Python内存管理机制

Python内存管理有三个机制:
对象的引用计数机制
垃圾回收机制
内存池机制

对象的引用机制
1、计数增加或者减少:
为对象分配新名称时,将对象放入一个新的容器时,计数增加
使用del语句对对象别名进行销毁时,引用超出作用域或被重新赋值时,计数减少
2、对引用进行计数,计数归零时,会启用垃圾回收
垃圾回收机制
3、两个对象互相引用时,用del可以减少ab的引用计数,并销毁用于引用底层对象的名称
内存池机制
4、Pymalloc机制,内存池用于对小块内存的管理和释放
5、<256字节的对象使用pymalloc,而大的对象用系统分配内存
6、整数、浮点数、List都有着各自的内存池,并不共享,如分配又释放了一个整数内存空间,其不会被再分配给浮点数

讲到内存管理,就再讲一下内存泄漏和处理
刚才提到的ab循环引用会导致内存泄漏的问题,python内部的gc模块会分代(其实就是三个双向链表)回收垃圾。
对每个容器对象设置一个gc_refs值,找到一个容器对象引用的对象,gc_refs减一。
到最后,gc_refs>0的容器对象说明还存在被引用的对象,因此他们不会被释放,而放入到另一个链表中。
剩下的都是无法到达的对象,这些就可以释放了。
而对于循环引用中,是unreachable但collectable的对象,gc机制能定时自动回收,但如果该对象定义了__del__方法,则变成了uncollectable,则无法收集而导致内存泄漏.

gc机制会遍历所有被垃圾收集管理的对象,对性能要求较高,如何避免内存泄漏?
循环引用结束时,重新赋值为空值
循环引用中调用weakref(弱引用)模块,其原理是让对象不进入引用计数机制。

定位解决泄漏问题示例
https://blog.csdn.net/itfootball/article/details/95392266
https://www.cnblogs.com/zhaof/p/10031945.html
用pympler检查是否泄漏
用tracemalloc定位泄漏点
用raise Exception的方式打印调用链
解决泄漏问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值