python会不会出现内存泄露_Python内存泄漏和内存溢出的解决方案

本文探讨了Python中的内存泄漏问题,包括由C语言模块、全局容器和引用循环引起的内存泄漏。通过gc模块和objgraph工具进行诊断,并提供了解决方案。此外,也分析了内存溢出的原因和解决步骤,强调内存泄漏可能导致内存溢出。
摘要由CSDN通过智能技术生成

一、内存泄漏

像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题。

对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了“内存泄露”。

1、内存泄露的原因

对于 python 这种支持垃圾回收的语言来说,怎么还会有内存泄露? 概括来说,有以下三种原因:

所用到的用 C 语言开发的底层模块中出现了内存泄露。

代码中用到了全局的 list、 dict 或其它容器,不停的往这些容器中插入对象,而忘记了在使用完之后进行删除回收

代码中有“引用循环”,并且被循环引用的对象定义了__del__方法,就会发生内存泄露。

为什么循环引用的对象定义了__del__方法后collect就不起作用了呢?

gc模块最常使用的方法就是gc.collect()方法,使用collect方法对循环引用的对象进行垃圾回收。

如果我们在类中重载了__del__方法。__del__方法定义了在用del语句删除对象时除了释放内存空间以外的操作。

一般而言,在使用了del语句的时候解释器首先会看要删除对象的引用计数,如果为0,那么就释放内存并执行del方法。

在这里,首先del语句出现时本身引用计数就不为0(因为有循环引用的存在),所以解释器不释放内存;

再者,执行collect方法时应该会清除循环引用所产生的无效引用计数从而达到del的目的,对于这两个循环引用对象而言,

python无法判断调用它们的del方法时会不会要用到对方那个对象,比如在进行b.del()时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值