python之记录一次内存溢出

标签: python 记录 内存 | 发表时间:2015-12-14 16:37 | 作者:xiaoyu966
出处:http://www.iteye.com

问题现象

手头一个系统上线后,节点机中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,就解决了这个问题。

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [python 记录 内存] 推荐:

python之记录一次内存溢出

- - 研发管理 - ITeye博客
手头一个系统上线后,节点机中agent应用在运行10天后,占用系统内存居然高达10GB以上,这显然是发生了严重内存泄露. python是动态语言,对用动态语言的内存分析不是很容易,尝试了一下比较经典的内存分析工具meliae,但是发现不是很好用. 查了很多资料后,发现了 https://github.com/pympler/pympler 这个工具,官方文档地址为:.

Python 多进程日志记录

- Guancheng(冠诚) - qingbo.blog
刚开始用 Python 做 web 开发的时候我就想一个问题,如果 Python 应用需要自己记录一些比 accesslog 更详细的日志(使用 Python 的 logging module),又有多个进程,怎么办最好呢. 多个进程往同一个日志文件写入会不会出问题. 最近有个在 Apache 里用 mod_wsgi 运行的程序,设置了4个 process.

python内存不释放原理

- Sosi - shell&#39;s home
    在maillist里面看到无数次的有人问,python速度为什么这么慢,python内存管理很差. 如果你在意内存/CPU,不要用python,改用C吧. 就算C不行,起码也用个go或者java. 不过今天还是说说,python的内存为什么不释放.     首先,python的初始内存消耗比C大,而且大很多.

Python 内存不释放原理

- jyf1987 - python.cn(jobs, news)
在maillist里面看到无数次的有人问,python速度为什么这么慢,python内存管理很差. 如果你在意内存/CPU,不要用python,改用C吧. 就算C不行,起码也用个go或者java. 不过今天还是说说,python的内存为什么不释放.     首先,python的初始内存消耗比C大,而且大很多.

特征向量内存快速查找库 GitHub - spotify/annoy: Approximate Nearest Neighbors in C++/Python optimized for memory usage and loading/saving to disk

- -
还有一些其他库可以进行最近邻搜索. Annoy几乎和最快的库一样快(见下文),但实际上还有另一个功能让Annoy与众不同:它能够将静态文件用作索引. 特别是,这意味着您可以跨进程共享索引. Annoy还将创建索引与加载它们分离,因此您可以将索引作为文件传递并快速映射到内存中. Annoy的另一个好处是它试图最小化内存占用,因此索引非常小.

dropbox讲python

- chuang - Initiative
dropbox定制优化CPython虚拟机,自己搞了个malloc调度算法. 那个 !!!111cos(0). 期待这次PyCon China 2011.

Python调试

- - 企业架构 - ITeye博客
原文地址: http://blog.csdn.net/xuyuefei1988/article/details/19399137. 1、下面网上收罗的资料初学者应该够用了,但对比IBM的Python 代码调试技巧:. IBM:包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试:.

Python WSGI 初探

- - 坚实的幻想
在构建 Web 应用时,通常会有 Web Server 和 Application Server 两种角色. 其中 Web Server 主要负责接受来自用户的请求,解析 HTTP 协议,并将请求转发给 Application Server,Application Server 主要负责处理用户的请求,并将处理的结果返回给 Web Server,最终 Web Server 将结果返回给用户.

Python实现逻辑回归(Logistic Regression in Python)

- - 神刀安全网
Logistic Regression in Python ,作了中文翻译,并相应补充了一些内容. 本文并不研究逻辑回归具体算法实现,而是使用了一些算法库,旨在帮助需要用Python来做逻辑回归的训练和预测的读者快速上手. 逻辑回归是一项可用于预测二分类结果(binary outcome)的统计技术,广泛应用于金融、医学、犯罪学和其他社会科学中.

python 下载文件

- Eric - python相关的python 教程和python 下载你可以在老王python里寻觅
之前给大家分享的python 多线程抓取网页,我觉的大家看了以后,应该会对python 抓取网页有个很好的认识,不过这个只能用python 来抓取到网页的源代码,如果你想用做python 下载文件的话,上面的可能就不适合你了,最近我在用python 做文件下载的时候就遇到这个问题了,不过最终得以解决,为了让大家以后碰过这个问题有更好的解决办法,我把代码发出来:.