问题现象

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

问题原因

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

具体的分析过程我就不在这里描述了,大家可以通过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 内存溢出_python之记录一次内存溢出相关推荐

  1. python 内存溢出能捕获吗_python之记录一次内存溢出

    问题现象 手头一个系统上线后,节点机中agent应用在运行10天后,占用系统内存居然高达10GB以上,这显然是发生了严重内存泄露. 问题原因 python是动态语言,对用动态语言的内存分析不是很容易, ...

  2. python多线程并发_Python进阶记录之基础篇(二十四)

    回顾 在Python进阶记录之基础篇(二十三)中,我们介绍了进程的基本概念以及Python中多进程的基本使用方法.其中,需要重点掌握多进程的创建方法.进程池和进程间的通信.今天我们讲一下Python中 ...

  3. python申请内存函数_Python Ctypes c函数的内存分配

    我现在有一个python回调函数,它使用ctypes库调用c函数.c函数需要一个指向一个结构的指针,例如animal_info_s,我实例化了这个结构并将它作为指向c函数的指针传递,它就可以工作了.我 ...

  4. python解题教学_Python解题记录第10题

    [本文结构]题目信息:来源.地址.序号.描述 题目答案:简要分析,程序代码(测试运行通过,含注释),运行结果 霍霍磨刀:解答这道题目之前应掌握的知识基础 解析过程:题目类型,分析以及实践过程 斩获成果 ...

  5. python 获取内存使用率_Python获取CPU使用率、内存使用率、网络使用状态 | 学步园...

    注:需要安装psutil库 源代码如下: #!/usr/bin/env python # # $Id: iotop.py 1160 2011-10-14 18:50:36Z g.rodola@gmai ...

  6. python socket编程_Python学习记录-socket编程

    1. OSI七层模型详解 2. Python socket 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答 ...

  7. 用python画糖葫芦_python学习记录六

    返回函数 def calc_sum(*args): ax=0for n inargs: ax= ax +nreturn ax def lazy_sum(*args): def sum(): ax = ...

  8. 用python画糖葫芦_python学习记录四

    切片 取一个list或者tuole得部分元素都是非常常见得操作 比如说一个list如下: >>> L = ['Michael','Sarah','Tracy','Bob','Jack ...

  9. python多进程内存共享_Python—并发编程04多进程内存共享,python,间,的

    Manaegr实现数据共享 导入 :from multiprocessing import Manager 实例化:m= Manager() num = m.dict( {键 :  值} ) num ...

最新文章

  1. [skill] vim 操作多个window
  2. c++常见操作的模板
  3. tensorflow 风格迁移二
  4. 2 自动递增_有石CAD自动下单,1天工作量1小时完成
  5. 中国游戏公司研运一体发展专题分析2020
  6. 数据库操作:MFC连接与MYSQL
  7. bzoj 1787 bzoj 1832: [Ahoi2008]Meet 紧急集合(倍增LCA)
  8. apache POI技术的使用
  9. 【PID优化】基于蝙蝠 粒子群 花卉授粉算法和布谷鸟搜索算法实现热交换器的PI控制器优化
  10. HTML5七夕情人节表白网页(爱情树 Html5实现唯美表白动画代码) HTML+CSS+JavaScript
  11. cab文件介绍及制作方法 1
  12. C++用cmath求平方根和次方
  13. 腾讯 MIG 移动互联网事业群 米格招聘
  14. 【场景化解决方案】OA付款审批同步到金蝶KIS
  15. CuPy is not correctly installed
  16. 调整bandizip压缩参数获得最大压缩效果
  17. C语言的转义字符,八进制
  18. 记录:关于Win10系统中Microsoft Edge上的网页如何滚动截屏?
  19. Docker(24)- docker login 命令详解
  20. C++ opencv 识别火焰 (代码)

热门文章

  1. 苏格拉底的“灵魂”的哲学意味
  2. 加载图片时报错,请大虾帮忙看看!
  3. python wmi读取网卡MAC地址、CPU序列号、硬盘序列号、主板序列号、BIOS序列号
  4. java中finaljava中this_Java中this,static,final,const用法详解
  5. db2 删除索引_程序员必须了解的知识点——你搞懂mysql索引机制了吗?
  6. 测试工程师应懂的Python知识
  7. 接口自动化测试(Python+Requests+Unittest)
  8. matlab两个曲线的名称怎么显示出来的,求MATLAB的高手,怎么把两张仿真曲线合并显示在一张图上?...
  9. python 识别图形验证码_Python图片验证码降噪处理实例!此乃识别验证码神技!...
  10. 《我的第一本算法书》读书笔记