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

python之记录一次内存泄露

阅读更多

问题现象

手头一个系统上线后,节点机中agent应用在运行10天后,占用系统内存居然高达10GB以上,这显然是发生了严重内存泄露。

 

问题原因

python是动态语言,对用动态语言的内存分析不是很容易,尝试了一下比较经典的内存分析工具meliae,但是发现不是很好用。查了很多资料后,发现了https://github.com/pympler/pympler 这个工具,官方文档地址为:

http://pythonhosted.org/Pympler/tutorials/muppy_tutorial.html

具体的分析过程我就不在这里描述了,大家可以通过pympler的官方文档去尝试。

 

在跟踪分析后,发现agent代码中的ProgressThread在一直增长,没有被释放。相关代码如下:

        progress_thread = ProgressThread(vid, segments, master_urls, self.hostname)
        progress_thread.setDaemon(True)
        progress_thread.start()
        self.progress_threads.append(progress_thread)

 可以看到,在类对象中,progress_threads这个列表,每次创建一个ProgressThread线程对象时,就会把对象插入到progress_threads列表中。

 

python的垃圾回收机制中,会自动对引用计数为0的对象回收。这里每次创建的线程对象,都被插入到progress_threads中,这导致了即使线程运行完毕了,其引用计数一直为1,导致所有的线程对象无法被回收。

 

问题解决

知道了问题原因,就很好解决了。在线程退出的地方,加入如下一行代码

            if progress_thread.if_stop == True:
                self.progress_threads.remove(progress_thread)

 让线程对象的引用计数为0,就解决了这个问题。

 

1
1
分享到:
评论

相关推荐

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

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

    Python-MemoryProfiler是一个python模块用于监视进程的内存消耗

    一旦安装完成,可以在Python脚本中引入`@profile`装饰器,将它应用到目标函数上,或者在命令行中使用`mprof run`命令来运行脚本并记录内存使用情况。 例如,假设我们有一个名为`test_memory.py`的脚本,其中包含一...

    内存泄露检查工具

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

    Python-memoryutils一个帮助对抗和防止内存泄漏的工具

    总的来说,Python-memoryutils是Python开发中不可或缺的工具之一,尤其对于开发长期运行的服务或者内存敏感的应用,它能够有效地帮助开发者发现并解决内存泄漏问题,提高程序的稳定性和效率。通过学习和使用这个库,...

    填坑总结:python内存泄漏排查小技巧(csdn)————程序.pdf

    本篇文章主要围绕一个实际案例,探讨如何排查和解决Python内存泄漏问题。 案例背景: 1. 服务在13号更新后,从23号开始出现内存持续上升,重启后攀升速度加快。 2. 服务在A、B两种芯片上部署,B芯片出现内存泄漏...

    测试系统内存泄露的工具

    内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄露可能不明显,但随着时间的推移,这些未释放的内存会逐渐积累,最终导致系统性能下降。内存泄露通常由于程序员的疏忽或编程错误引起,例如...

    Python-memspector检查Python函式的内存使用情况

    `memspector`通过记录对象的生命周期来监测内存使用,它可以在运行时跟踪Python对象的创建、增长和释放,提供了对函数级内存消耗的详细视图。这种工具对于进行性能优化至关重要,因为Python的动态类型和垃圾回收机制...

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

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

    对python程序内存泄漏调试的记录

    调试python程序时,用下面这段代码,可以获得进程占用系统内存值。程序跑一段时间后,就能画出进程对内存的占用情况。 def memory_usage_psutil(): # return the memory usage in MB import psutil,os process =...

    C语言扩展Python学习记录.zip

    Python的`Py_INCREF`和`Py_DECREF`用于增加和减少对象引用计数,避免内存泄漏。 7. **错误处理**: C扩展中必须处理异常和错误,通常使用`PyErr_Occurred`检查错误,`PyErr_SetString`设置错误信息,以及`PyErr_...

    Python-profiling一个交互式Python性能分析工具

    3. **内存分析**:部分版本的Python-profilng提供了内存使用情况的分析,帮助我们定位可能导致内存泄漏的问题。 4. **代码覆盖率分析**:虽然不是标准功能,但可以通过与其他工具结合,如coverage.py,来获取代码...

    Python面试宝典.pdf

    2. 了解Python中内存泄露的原因、解决方法等。 垃圾回收机制 1. 了解Python中垃圾回收机制的基本概念,包括引用计数、标记-清除、分代回收等。 2. 了解Python中垃圾回收机制的优点、缺点等。 本资源摘要信息提供...

    winleak_内存泄露检测

    一旦检测到内存泄露,工具将显示相关的信息,如泄漏内存的大小、最后一次分配时的堆栈跟踪,以及可能导致泄露的代码行。这有助于开发者快速定位问题,修复内存泄露。 除了以上核心功能,"winleak"可能还包含了其他...

    Python-一个采用Python开发的简单缓存服务器

    2. **内存管理**:理解Python的垃圾回收机制,以及如何有效管理内存,防止内存泄漏。 3. **并发处理**:如果服务器需要处理多个并发请求,那么就需要了解Python的多线程或多进程模型,以及如何使用锁等同步机制来...

    Python3高级教程_python3_高级教程_电子版_

    它们可以在运行时生成数据,避免一次性加载大量数据导致内存压力,适用于处理大数据流或无限序列。 四、异步编程 Python3.5引入了asyncio库,支持协程(coroutine)和异步I/O,极大地提高了网络服务和并发处理的...

    python清除函数占用的内存方法

    每当创建一个对象时,Python都会为其分配内存,并设置一个引用计数器,记录有多少引用指向该对象。一旦对象的引用计数降为零,意味着没有任何变量指向该对象,Python的垃圾收集器将自动回收这部分内存。然而,在某些...

    Python-ptracer一个用于Python程序的基于ptrace跟踪的库

    Python-ptracer是一个强大的工具,专为Python程序设计,利用Linux内核的ptrace系统调用来实现进程跟踪。Ptrace是Linux系统中一个低级别的接口,允许一个进程(tracer)挂载另一个进程(tracee),监视其系统调用和...

Global site tag (gtag.js) - Google Analytics