一、内存泄漏

像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()时可能会用到b._a也就是a,如果在那之前a已经被释放,那么就彻底GG了。

为了避免这种情况,collect方法默认不对重载了del方法的循环引用对象进行回收,而它们俩的状态也会从unreachable转变为uncollectable。由于是uncollectable的,自然就不会被collect处理,所以就进入了garbage列表。

2、内存泄露的诊断思路

无论是哪种方式的内存泄露,最终表现的形式都是某些 python 对象在不停的增长;因此,首先是要找到这些异常的对象。

3、诊断步骤

用到的工具: gc 模块和 objgraph 模块

gc模块 是Python的垃圾收集器模块,gc使用标记清除算法回收垃圾

objgraph 是一个用于诊断内存问题的工具

1、 在服务程序的循环逻辑中,选择出一个诊断点

2、 在诊断点,插入如下诊断语句

import gc

import objgraph

### 强制进行垃圾回收

gc.collect()

### 打印出对象数目最多的 50 个类型信息

objgraph.show_most_common_types(limit=50)

4、检查统计信息,找到异常对象

运行加入诊断语句的服务程序,并将打印到屏幕上的统计信息重定向到日志中。运行一段时间后,就可以来分析日志,看看哪些对象在不停的增长。

比如,排查结果可能是:

一个多线程程序,多个线程作为生产者,一个线程作为消费者,通过将一个 tuple 对象送入异步队列进行通信。

由于消费者的处理速度跟不上生产者的速度,又没有进行同步, 导致异步队列中的对象越来越多。

二、内存溢出

1、内存溢出原因

内存中加载的数据量过于庞大,如一次从数据库取出过多数据

集合类中有对对象的引用,使用完后未清空,产生了堆积,使得JVM不能回收

代码中存在死循环或循环产生过多重复的对象实体

使用的第三方软件中的BUG

启动参数内存值设定的过小

2、内存溢出的解决方案

第一步,修改JVM启动参数,直接增加内存(-Xms,-Xmx参数一定不要忘记加)

第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置

重点排查以下几点:

检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

检查代码中是否有死循环或递归调用。

检查是否有大循环重复产生新对象实体。

检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

第四步,使用内存查看工具动态查看内存使用情况

三、内存泄漏和内存溢出的区别

内存溢出是指向JVM申请内存空间时没有足够的可用内存了,就会抛出OOM即内存溢出。

内存泄漏是指,向JVM申请了一块内存空间,使用完后没有释放,由于没有释放,这块内存区域其他类加载的时候无法申请,

同时当前类又没有这块内存空间的内存地址了也无法使用,相当于丢了一块内存,这就是内存泄漏。

值得注意的是内存泄漏最终会导致内存溢出,很好理解,内存丢了很多最后当然内存不够用了。

以上就是Python内存泄漏和内存溢出的解决方案的详细内容,更多关于Python内存泄漏和内存溢出的资料请关注龙方网络其它相关文章!

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

  1. windows 内存泄露和资源泄漏调试

    AQTime (有x64.win32的)进行内存泄露和资源泄漏监控 http://wenku.baidu.com/view/9aa1c2afdd3383c4bb4cd2c1.html x64下载:ht ...

  2. c++内存泄露:使用性能监视器进行内存泄露的确认

    对于服务器程序,在不停的运作中,如何去测试是否存在内存泄露,如果你的开发环境是在windows下,那么我们就可以使用windows自带的性能监视器来观察程序的性能. 使用此例子: // Test.c ...

  3. python的内存泄露_Python 程序的内存泄露,教你一招来解决?

    如果大家在 Linux 或者 macOS 下面运行一段可能导致内存泄露的程序,那么你可能会看到下面这样的情况: 而如果你用的系统是 Windows,那么可能电脑直接就卡死了. 但是,调试这种 OOM( ...

  4. java内存泄露有什么后果,Java内存泄露问题是什么?

    很多人在谈论内存泄露问题,当然对于c/c++来说,这个应该是老掉牙的问题,但是很多Java人员也越来越多得讨论这个问题,我这里写个小结,希望对大家有一定的参考价值. 内存泄漏的慨念 1.c/c++是程 ...

  5. linux 内存泄露 工具,Linux Kernel模块内存泄露分析

    1.通过free 看 剩余内存 # free total used free shared buffers Mem: 2065866752 1268113408 797753344 0 9060352 ...

  6. chrome内存泄露(一)、内存泄漏分析工具

    内存分析使用的工具包括chrome任务管理器.chrome时间轴(低版本是Timeline,高版本对应performance).chrome memory(低版本是chrome profiles,主要 ...

  7. linux pmap 内存泄露,一个驱动导致的内存泄漏问题的分析过程(meminfo-pmap-slabtop-alloc_calls)...

    关键词:sqllite.meminfo.slabinfo.alloc_calls.nand.SUnreclaim等等. 下面记录一个由于驱动导致的内存泄漏问题分析过程. 首先介绍问题背景,在一款嵌入式 ...

  8. java 导致内存泄露的情况_JConsole定位内存泄漏

    在本文中,我们将看到Java中内存泄漏的示例代码.之后,我们将把Java应用程序连接到JConsole,比较有无内存泄漏时应用程序的内存使用情况.深入研究JConsole的内存监控工具可以让我们看到堆 ...

  9. python 类变量 none 内存泄露_Python中使用自定义类class作为海量数据结构时内存占用巨大的问题...

    最近碰到处理一个二十多兆的文件时内存蹭蹭的吃掉四百多兆,吓死宝宝了. 无奈毕竟接触python时间有限,还没有完整的看过python的一些基础知识,我想一个合格的pythoner应该不会碰到这个问题. ...

最新文章

  1. 重磅!国内首个面向自动驾驶领域的多传感器数据融合系统课程
  2. c语言 dll注入,教大家写一个远程线程的DLL注入,其实还是蛮简单的……………………...
  3. iOS swift2.3 迁移到3.0 遇到的一些问题
  4. 网页文件都是php怎么修改,请问你们怎么将html的文件的内容改变为php
  5. git 分支推送项目
  6. 程序异常异常代码: 0xc0000005_Java基础:看完这篇你还怕碰到异常吗?
  7. Android 应用内直接跳转酷市场
  8. .NET的RedisProvider
  9. android 上传头像工具类,Android开发中如何实现头像的更换与上传
  10. java上机实验报告_javaweb上机实验报告(学生管理系统)
  11. C# 创建Excel文件
  12. c语言浪漫烟花表白,C语言实战之浪漫烟花表白程序.pdf
  13. MATLAB语音信号处理系统GUI
  14. neo4j中心度算法(Centrality algorithm)-3.Closeness Centrality algorithm
  15. Moore-Penrose广义逆(加号广义逆)定义及相关性质
  16. 【第十一篇】字体设置css变形(transfom)4种
  17. python opencv把一张图片嵌入(叠加)到另一张图片上
  18. 企业级网络架构—云平台高可用网络的修炼之道
  19. RStudio介绍及入门
  20. 关于合成大西瓜的随笔

热门文章

  1. UITableView HeaderView,FooterView 使用SnapKit布局导致约束异常
  2. SQL Server基础操作(此随笔仅作为本人学习进度记录七 !--存储过程)
  3. Java虚拟机垃圾收集算法
  4. 【MySQL解惑笔记】忘记MySQL数据库密码
  5. BZOJ4766: 文艺计算姬
  6. android layout analyze
  7. git 从远程主服务器当中创建新分支
  8. 黑马程序员5 多线程
  9. IE6,7,8,FF兼容总结
  10. Jdk11,Jdk12的低延迟垃圾收集器ZGC