问题现象
手头一个系统上线后,节点机中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内存泄漏** 内存泄漏通常是由于以下几个原因引起的: 1. **C扩展模块的内存泄漏**:使用C语言编写的Python扩展模块可能没有正确地管理内存,导致内存无法被Python垃圾回收器回收。 2. **全局变量与...
一旦安装完成,可以在Python脚本中引入`@profile`装饰器,将它应用到目标函数上,或者在命令行中使用`mprof run`命令来运行脚本并记录内存使用情况。 例如,假设我们有一个名为`test_memory.py`的脚本,其中包含一...
7. MemoryProfiler:对于Python开发者,有一个名为MemoryProfiler的库,可以用来分析Python脚本运行时的内存使用情况,找出可能的内存泄露点。 使用这些工具时,通常需要按照以下步骤进行: 1. 构建项目:首先,...
总的来说,Python-memoryutils是Python开发中不可或缺的工具之一,尤其对于开发长期运行的服务或者内存敏感的应用,它能够有效地帮助开发者发现并解决内存泄漏问题,提高程序的稳定性和效率。通过学习和使用这个库,...
本篇文章主要围绕一个实际案例,探讨如何排查和解决Python内存泄漏问题。 案例背景: 1. 服务在13号更新后,从23号开始出现内存持续上升,重启后攀升速度加快。 2. 服务在A、B两种芯片上部署,B芯片出现内存泄漏...
内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄露可能不明显,但随着时间的推移,这些未释放的内存会逐渐积累,最终导致系统性能下降。内存泄露通常由于程序员的疏忽或编程错误引起,例如...
`memspector`通过记录对象的生命周期来监测内存使用,它可以在运行时跟踪Python对象的创建、增长和释放,提供了对函数级内存消耗的详细视图。这种工具对于进行性能优化至关重要,因为Python的动态类型和垃圾回收机制...
标题中的“Python-支持Windows/Linux/Mac和Android的内存调试程序”指的是一个跨平台的内存调试工具,它专为Python应用程序设计,可以在多种操作系统上运行,包括Windows、Linux、Mac OS以及Android。内存调试是软件...
调试python程序时,用下面这段代码,可以获得进程占用系统内存值。程序跑一段时间后,就能画出进程对内存的占用情况。 def memory_usage_psutil(): # return the memory usage in MB import psutil,os process =...
Python的`Py_INCREF`和`Py_DECREF`用于增加和减少对象引用计数,避免内存泄漏。 7. **错误处理**: C扩展中必须处理异常和错误,通常使用`PyErr_Occurred`检查错误,`PyErr_SetString`设置错误信息,以及`PyErr_...
2. 了解Python中内存泄露的原因、解决方法等。 垃圾回收机制 1. 了解Python中垃圾回收机制的基本概念,包括引用计数、标记-清除、分代回收等。 2. 了解Python中垃圾回收机制的优点、缺点等。 本资源摘要信息提供...
3. **内存分析**:部分版本的Python-profilng提供了内存使用情况的分析,帮助我们定位可能导致内存泄漏的问题。 4. **代码覆盖率分析**:虽然不是标准功能,但可以通过与其他工具结合,如coverage.py,来获取代码...
一旦检测到内存泄露,工具将显示相关的信息,如泄漏内存的大小、最后一次分配时的堆栈跟踪,以及可能导致泄露的代码行。这有助于开发者快速定位问题,修复内存泄露。 除了以上核心功能,"winleak"可能还包含了其他...
2. **内存管理**:理解Python的垃圾回收机制,以及如何有效管理内存,防止内存泄漏。 3. **并发处理**:如果服务器需要处理多个并发请求,那么就需要了解Python的多线程或多进程模型,以及如何使用锁等同步机制来...
它们可以在运行时生成数据,避免一次性加载大量数据导致内存压力,适用于处理大数据流或无限序列。 四、异步编程 Python3.5引入了asyncio库,支持协程(coroutine)和异步I/O,极大地提高了网络服务和并发处理的...
每当创建一个对象时,Python都会为其分配内存,并设置一个引用计数器,记录有多少引用指向该对象。一旦对象的引用计数降为零,意味着没有任何变量指向该对象,Python的垃圾收集器将自动回收这部分内存。然而,在某些...
Python-ptracer是一个强大的工具,专为Python程序设计,利用Linux内核的ptrace系统调用来实现进程跟踪。Ptrace是Linux系统中一个低级别的接口,允许一个进程(tracer)挂载另一个进程(tracee),监视其系统调用和...