python之内存泄漏该如何处理(没有废话)?

本文介绍了Python内存泄漏的三种常见场景,包括未开启GC、逻辑中未清除不再需要的数据以及Python 3.4之前的特定循环引用问题。针对这些问题,提出了相应的解决策略,如使用pyrasite检查GC状态,通过objgraph库进行对象增长分析和引用链查找,以及升级Python版本来解决循环引用问题。
摘要由CSDN通过智能技术生成

1.明确内存泄漏的几种场景。

      1.没有开gc,或者gc设为debug状态,导致交叉引用没有被回收调

      2.如果一个数据在逻辑上不应该存在,但是因为代码上没有做相关清除操作,导致他还存在,也是一种泄漏

          举个栗子,例如我要记录最近50天的某个基金的日化收益率,定义一个全局的字典global_dict,运行了一个脚本进行计算,没10分钟算一次,但是我没有进行clear操作,每次的计算只是单纯的赋值dict[date] = rate,按理来说dict["五十天前"]的收益率都是不需要的,就是一种泄漏。

      3.这种情况出现在python3.4之前,因为3.4已经修复了,是这样的,如果一个类定义了__del__,并且该类存在循环引用的情况,这时候gc就会把这个类放在gc.garbage当中,不会去做回收,可以说是跳出了分代回收的机制,但是3.4之后的版本就没有这种情况,会把他回收调。

 

2.根据场景去找问题

     1.如果是第一种情况解决就最简单了,可以用某个调试库连接到线上的进程,这里推荐pyrasite,但是要注意,这东西很久都没有更新了,所以有可能会和py的版本出现不相容的情况,例如python3.6就把itervalues改为values,导致一些工具用不到,不过没关系,我们只是用它来连上去,看gc而且,等我们连上进程后,就可以调用gc.isenable()去看gc有没有打开了或者状态是否正确

     2.第二种情况就比较复杂了,我建议线下压测复现,不管

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值