`
rstevens
  • 浏览: 95903 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python 内存泄露的诊断

阅读更多
对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了“内存泄露”。
最近在我的项目中,就出现了内存持续增长的情况,goolge 了一下,发现 Tracing Python memory leaks 讲了一种诊断方式,并给出了实例。而我的案例与此文稍有不同,下面就结合我的案例,谈谈如何诊断内存泄露:

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

1、 所用到的用 C 语言开发的底层模块中出现了内存泄露。
2、 代码中用到了全局的 list、 dict 或其它容器,不停的往这些容器中插入对象,而忘记了在使用完之后进行删除回收
3、 代码中有“引用循环”, python 垃圾处理机制无法进行回收


二、 内存泄露的诊断思路

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

三、 内存泄露的诊断步骤

用到的工具: gc 模块和 objgraph 模块
objgraph 是一个用于诊断内存问题的有用的工具


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


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

import gc
import objgraph
### 强制进行垃圾回收
gc.collect()
### 打印出对象数目最多的 50 个类型信息
objgraph.show_most_common_types(limit=50)



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

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

以我的程序为例,我将日志记录到 log.txt 中,运行一段时间后,发现 tuple 和 list 类型的对象不停增长:

# grep "^list " log.txt
# grep "^tuple " log.txt


如果不停增长的对象,是一些非通用的类型(例如你自己实现的一个 class),那么问题就比较好定位,例如 Tracing Python memory leaks中提到的案例。

而对 tuple 和 list 这类通用类型,要想知道对象到底是什么,泄露发生在哪里,还得想点办法。我采用了排查的方式。由于程序的模块化还不错,可以每次禁用一个模块,然后重新跑程序,重新检查日志,看看 tuple 和 list 是否仍然不停增长。这样,很快就能将故障定位到具体的模块中。

最后终于找到了原因,属于上面总结的第二种原因:
我的程序是一个多线程程序,多个线程作为生产者,一个线程作为消费者,通过将一个 tuple 对象送入异步队列进行通信。由于消费者的处理速度跟不上生产者的速度,又没有进行同步, 导致异步队列中的对象越来越多。

四、参考文档
1. http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks
2. http://mg.pov.lt/blog/python-object-graphs.html
3. http://mg.pov.lt/blog/hunting-python-memleaks







2
0
分享到:
评论

相关推荐

    Python内存泄漏和内存溢出的解决方案

    **一、Python内存泄漏** 内存泄漏通常是由于以下几个原因引起的: 1. **C扩展模块的内存泄漏**:使用C语言编写的Python扩展模块可能没有正确地管理内存,导致内存无法被Python垃圾回收器回收。 2. **全局变量与...

    好用的内存泄漏工具,针对c++语言。vs

    在实际开发中,除了VLDB,还有其他一些内存泄漏检测工具,如Valgrind(主要针对Linux环境),或是Visual Studio自身提供的诊断工具。不过,VLDB的优势在于其与Visual Studio的无缝集成,使得在Windows平台上进行内存...

    内存泄露检查工具

    7. MemoryProfiler:对于Python开发者,有一个名为MemoryProfiler的库,可以用来分析Python脚本运行时的内存使用情况,找出可能的内存泄露点。 使用这些工具时,通常需要按照以下步骤进行: 1. 构建项目:首先,...

    Python-支持WindowsLinuxMac和Android的内存调试程序

    标题中的“Python-支持Windows/Linux/Mac和Android的内存调试程序”指的是一个跨平台的内存调试工具,它专为Python应用程序设计,可以在多种操作系统上运行,包括Windows、Linux、Mac OS以及Android。内存调试是软件...

    Python-StackImpactPythonAgent生产环境应用分析器CPU内存分配异常指标等等

    它能够帮助开发者实时监控和诊断应用程序的性能问题,特别是在CPU使用率、内存分配以及调用热点等方面的问题。通过深入分析,StackImpactAgent可以提供连续且详细的应用程序性能视图,以便于及时发现并解决潜在的...

    python 怎样进行内存管理

    Python是一种高级编程语言,它的内存管理机制是其高效运行的关键组成部分。主要分为三个核心方面:对象的引用计数机制、垃圾...同时,熟悉Python的内存管理机制也能帮助开发者更好地理解和诊断程序中的内存相关问题。

    python35_d.lib和python35_d.dll

    python35_d.dll包含了Python的全部功能,同时提供了调试版本特有的标志和功能,如内存泄漏检测、异常堆栈跟踪等。 放置位置方面,按照描述,python35_d.lib应放置在Visual Studio的安装目录下的VC/lib子目录,这是...

    python服务器管理

    监控内存使用对于防止内存泄漏和优化内存消耗大的程序至关重要。 4. 硬盘使用率: 服务器硬盘的使用情况同样关键。`psutil` 允许你获取各分区的磁盘空间总量、已用空间、剩余空间以及使用率。这可以帮助预测硬盘...

    用Python编写分析Python程序性能的工具的教程

    本教程将引导你了解如何使用Python来编写分析Python程序性能的工具,重点关注内存泄漏检测和时间性能的衡量。 首先,性能分析通常涉及回答四个核心问题: 1. 程序运行速度:这是衡量程序执行速度的基础,了解程序...

    libxml2-python-2.7.7.win32-py2.7.exe

    6. **内存管理**:libxml2的内存管理机制优化了资源的使用,避免了内存泄漏,保证了程序的稳定运行。 7. **安全性**:libxml2包含了安全相关的功能,如防止XML注入攻击,保障数据的安全性。 对于Python开发者来说...

    Python中使用MELIAE分析程序内存占用实例

    总的来说,使用MELIAE或其他内存分析工具可以帮助你有效地诊断和解决Python程序的内存问题。通过持续监控和分析,可以确保程序的性能和资源效率,避免不必要的内存占用导致的性能下降或程序崩溃。

    memoryleak

    2. **使用内存分析工具**:例如Valgrind、LeakCanary(Android)或Visual Studio的诊断工具,这些工具可以帮助检测程序运行时的内存泄漏。 3. **生成内存转储(dump文件)**:当程序崩溃或异常时,可以生成内存转储...

    内存使用情况

    对于开发者来说,深入理解内存管理原理,熟练掌握内存分析工具,如Visual Studio的诊断工具,可以帮助找到内存泄漏和性能瓶颈。同时,使用智能指针(如`std::unique_ptr`和`std::shared_ptr`)或RAII(Resource ...

    内存遍历工具源码

    内存遍历是指程序在运行时检查系统内存中的每一个地址,查看其中存储的数据,以获取内存使用情况、查找异常或进行诊断。这类工具通常包括以下功能: 1. **内存分配与释放跟踪**:工具会记录内存块的分配和释放过程...

    memory_profiler

    总的来说,"memory_profiler"是一个强大的Python内存分析工具,它提供了精细的内存使用报告,有助于诊断和解决内存相关的问题。无论你是初学者还是经验丰富的开发者,都应该将其纳入你的性能优化工具箱。通过有效...

    Python库 | MonkeyScope-1.3.4.tar.gz

    MonkeyScope 是一个强大的 Python 库,专为性能分析和内存泄漏检测而设计。这个1.3.4版本的 tar.gz 文件包含源代码和其他相关资源,使得开发者能够在自己的项目中集成 MonkeyScope,以便对代码的运行时行为进行深入...

    Python库 | gc-overrides-0.1.0.tar.gz

    5. **监控和日志**:为了更好地理解和分析程序的内存行为,该库可能提供了监控和记录垃圾收集活动的功能,帮助开发者诊断潜在的内存泄漏问题。 6. **兼容性和移植性**:gc-overrides库可能考虑了Python的不同版本...

    Python库 | filprofiler-0.3.2-cp38-cp38-manylinux1_x86_64.whl

    在Python中,内存profiler可以帮助开发者识别程序中可能存在的内存泄漏或者过度消耗资源的部分,从而优化代码。 在Python的世界里,使用`pip`工具可以轻松安装`.whl`文件。用户只需要在命令行中输入以下命令: ```...

Global site tag (gtag.js) - Google Analytics