问题现象

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

问题原因

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

具体的分析过程我就不在这里描述了,大家可以通过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内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

  2. python里面的类和对象_Python中类和对象在内存中是如何保存?

    类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值 ...

  3. python 内存溢出_python之记录一次内存溢出

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

  4. python获取文件修改时间 错误_python错误记录

    raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e) django.core.exceptions. ...

  5. python报错输出到日志_Python日志记录和子进程输出和错误流

    基于Adam Rosenfield's code,你可以 >使用select.select来阻止,直到有要读取的输出 proc.stdout或proc.stderr, >然后读取并记录该输 ...

  6. 什么是python语言的动态类型机制_python的内存管理机制

    一.python是一个什么样类型的语言 1.python是一种动态解释性强类型定义的高级.通用性编程语言. 解释型:执行的时候,才一条一条的解释成机器语言给计算机来执行.如:python.js.rub ...

  7. python内存管理错误的是_Python内存管理机制

    俗话说,出来混早晚要还的,Python还有很多知识点没有总结成博客,欠了太多,先还一部分吧 1. Python对象的内存使用 内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言 ...

  8. python中画糖葫芦的代码_Python中的内存管理

    内存管理 包括: ①变量无须事先声明,变量无须指定类型 ②引用计数 ③垃圾回收 ④内存池机制 ①变量定义 不用事先声明变量类型而直接对变量进行赋值.对Python语言来讲,对象的类型和内存都是在运行时 ...

  9. 0x00000000指令引用的内存不能为written_「深入Java虚拟机」Java内存区域与内存溢出...

    内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈 ...

最新文章

  1. [Leetcode] Combinations 组合数
  2. Spring Validation 最佳实践及其实现原理,参数校验没那么简单!
  3. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 F- 1 + 2 = 3? (好难的找规律题)
  4. java file用法_Java File 类的使用方法详解(转)
  5. vim中括号自动补全
  6. 第 1 章 JVM 和 Java 体系架构
  7. lucene3.5学习笔记03--待续
  8. [算法模板]莫比乌斯反演
  9. Windows Server 2012 搭建DHCP及远程路由访问
  10. linux kernel source code analysis
  11. mysql表关联查询都有什么方式_Mysql数据库多表联合查询有几种方法?
  12. Vue_(组件)实例属性
  13. qi接收启动协议_基于QI协议的无线充电通信系统
  14. python编程入门电子书-《Python编程 从入门到实践》高清电子书免费下载
  15. Mac上的全局翻译利器 : Bob + PopClip
  16. 炒币机器人:炒币投资要大气
  17. 钢筋计数VOC数据集
  18. Python之第六章 内置容器 --- 字符串
  19. 【艾琪出品】-【计算机】测试题系列四参考资料
  20. 详解如何使用ArcGIS计算水库库容量

热门文章

  1. 蓝桥杯嵌入式板-解决LCD使LED亮灭混乱的办法
  2. Java生成真正格式的Excel文件
  3. Excel快速选择区域
  4. IDEA使用Build Artifacts进行项目打包时,发现没有可供打包的项目
  5. excel二极管伏安特性曲线_从交流电转直流电出发调研二极管的使用
  6. php读取文件部分内容,PHP 提高篇
  7. mysql唯一性约束冲突_如何解决逻辑删除与数据库唯一约束冲突
  8. mysql function select 赋值_数据分析面试之mysql的分组排序和变量赋值顺序
  9. geotools判断一个点是否在多边形上
  10. 设置字符串位数,不足位数补0