问题现象
手头一个系统上线后,节点机中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,就解决了这个问题。
相关推荐
如果把内存泄漏定义成只申请不释放,那么借着 Python 中整数可以无穷大的这个特点,我们一行代码就可以完成内存泄漏了。 i = 1024 ** 1024 ** 1024 循环引用导致内存泄漏 引用记数器 是 Python 垃圾回收机制的基础...
主要介绍了Python内存泄漏和内存溢出的解决方案,帮助大家维护后台进程,感兴趣的朋友可以了解下
Python文件:python来查看Linux系统内存使用情况.py Python文件:python来查看Linux系统内存使用情况.py
使用Python的timer来完成每天执行一次的定时任务,环境是windows,python3.4
Development tool to measure, monitor and analyze the memory behavior of Python objects in a running Python application.
python读书笔记,包含记录数组-内存映射-从 Matlab 到 Numpy
内存泄漏是一种常见的问题,尤其在Python循环中运行长时间的程序时容易发生。以下是一些可能的解决方法: 使用生成器(Generator):生成器是一种特殊的迭代器,可以迭代处理数据而不会占用大量内存。在Python中,...
Python 打算删除大量涉及像C和C++语言那样的复杂内存管理。当对象离开范围,就会被自动垃圾收集器回收。然而,对于由 Python 开发的大型且长期运行的系统来说,内存管理是不容小觑的事情。 在这篇博客中,我将会分享...
最近工作中慢慢开始用python协程相关的东西,所以用到了一些相关模块,如aiohttp, aiomysql, aioredis等,用的过程中也碰到的很多问题,这里整理了一次内存泄漏的问题 通常我们写python程序的时候也很少关注内存这个...
将指定进程在一段时间内的cpu使用率,物理内存和虚拟内存使用率,分别记录到txt文档中。
python 读取运行电脑的CPU、内存信息。cpu内核数、内存大小。。。
使用python记录按键信息,简单版本的监控
之前一直盲目的认为 Python 不会存在内存泄露, 但是眼看着上线的项目随着运行时间的增长 而越来越大的内存占用, 我意识到我写的程序在发生内存泄露, 之前 debug 过 logging 模块导致的内存泄露. 目前看来, 还有别的...
主要介绍了Python跑循环时内存泄露的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Python3进程内存分析器-用于运行python进程的内存分析器.zip memory_analyzer 运行内存分析器不需要您停止进程或添加任何特殊的调试代码或标志。尽管内存分析器收集有关内存中对象的信息时您的过程(及其所有线程...
Python学习资源 python学习记录网新python学习之路
Memory Profiler 是一个 python 模块,用于监视进程的内存消耗,甚至可以逐行分析 python 程序的内存消耗
Python不会自动清理这些内存,这篇文章主要介绍了谈谈如何手动释放Python的内存,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
内存管理,对于python这样的动态语言来说,是至关重要的一部分。它很大程度上决定了python的执行效率,对象的创建销毁,都涉及到内存的管理
初学者python学习记录-二元一次求根