我有一个长时间运行的脚本,如果让它运行足够长的时间,它将占用系统上的所有内存。

在不讨论剧本细节的情况下,我有两个问题:

是否有任何“最佳实践”可以遵循,这将有助于防止泄漏的发生? 在Python中有哪些调试内存泄漏的技术?


当前回答

不确定python中内存泄漏的“最佳实践”,但python应该通过它的垃圾收集器清除自己的内存。所以我主要会从检查一些短的循环列表开始,因为它们不会被垃圾收集器拾取。

其他回答

查看这篇文章:跟踪python内存泄漏

另外,请注意,垃圾收集模块实际上可以设置调试标志。看看set_debug函数。另外,查看Gnibbler编写的代码,以确定调用后创建的对象类型。

不确定python中内存泄漏的“最佳实践”,但python应该通过它的垃圾收集器清除自己的内存。所以我主要会从检查一些短的循环列表开始,因为它们不会被垃圾收集器拾取。

您应该特别查看全局数据或静态数据(长寿数据)。

当这些数据不受限制地增长时,在Python中也会遇到麻烦。

垃圾收集器只能收集不再被引用的数据。但是静态数据可以连接应该释放的数据元素。

另一个问题可能是内存周期,但至少在理论上垃圾收集器应该找到并消除周期——至少只要它们不依赖于一些长期存在的数据。

什么样的长寿命数据特别麻烦?仔细查看任何列表和字典——它们可以无限制地增长。在字典中,你甚至可能看不到这个问题,因为当你访问字典时,字典中的键数可能对你来说不是很明显……

要检测和定位长时间运行进程的内存泄漏,例如在生产环境中,您现在可以使用堆栈影响。它在下面使用tracemalloc。更多信息在这篇文章。

这绝不是详尽的建议。但是,在考虑避免未来的内存泄漏(循环)时,要记住的第一件事是确保任何接受回调引用的东西都应该将该回调存储为弱引用。