我意识到一个python脚本中存在内存泄漏。首先占用25MB左右,15天后占用超过500MB。
我遵循了许多不同的方式,并且不能像蟒蛇新手那样深入到问题的根源......
最后,我得到了以下内容
objgraph.show_most_common_types(limit=20)
tuple 37674
function 9156
dict 3935
list 1646
wrapper_descriptor 1468
weakref 888
builtin_function_or_method 874
classobj 684
method_descriptor 551
type 533
instance 483
Kind 470
getset_descriptor 404
ImmNodeSet 362
module 342
IdentitySetMulti 333
PartRow 331
member_descriptor 264
cell 185
FontEntry 170
我设置了一个断点,在每次迭代之后,这就是正在发生的事情......
objgraph.show_growth()
tuple 37674 +10
最好的方法是什么?
(Pdb) c
(Pdb) objgraph.show_growth()
tuple 37684 +10
我想打印出所有的元组,并交叉检查 - 每次添加10个元组会给我一些线索吗?请告诉我如何做到这一点..
或者是否有其他方法可以找出此内存泄漏。我使用python 2.4.3,并且由于许多其他产品依赖 - 不幸的是我不能/不应该升级。
答案 0 :(得分:2)
我是否正确地阅读了相同的脚本不停运行15天?
对于这种长时间运行的进程,定期重启是一种很好的做法,它比消除所有内存泄漏要容易得多。
更新:查看this answer,它似乎完全符合您的需要 - 打印所有未添加垃圾的新添加的对象。
答案 1 :(得分:0)
我的第一个想法是,可能是你在脚本中创建新对象并将它们累积在某种全局列表中。通常更容易查看脚本并确保您不会生成任何持久数据而不是调试垃圾。我认为您使用的实用程序objgraph还允许您使用对它的引用数打印垃圾对象。你可以试试。