从调试器中打印所有可用元组
我发现一个Python脚本有内存泄漏的问题。一开始占用了大约25MB的内存,经过15天后,这个占用量已经超过了500MB。
我尝试了很多不同的方法,但作为一个Python新手,我还是没能找到问题的根源...
最后,我得到了以下内容:
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,由于有很多其他产品的依赖关系,遗憾的是我不能/不应该升级。
2 个回答
0
我首先想到的是,你可能在你的脚本中创建了新的对象,并把它们放在某种全局列表里。通常,检查一下你的脚本,确保没有生成任何持久的数据,比起调试那些垃圾数据要简单得多。我觉得你使用的工具 objgraph 也可以让你打印出那些垃圾对象,以及指向它们的引用数量。你可以试试这个方法。
2
我理解得对吗?同一个脚本已经连续运行了15天,没有停过?
对于这样长时间运行的程序,定期重启是个好习惯,这比解决所有内存泄漏问题要简单得多。
更新:看看这个回答,它似乎正好满足你的需求——打印出所有新添加的、还没有被垃圾回收的对象。