在一个非常大的项目中,我正在寻找内存泄漏。到目前为止我的进展如下:
使用班级计数器,
import gc
from collections import Counter
def count():
return Counter(type(o).__name__ for o in gc.get_objects())
我看到对于程序的每个渲染过程,我获得了dicts和instancemethods:
Counter({'instancemethod': 9714, 'dict': 7274, ...
Counter({'instancemethod': 9716, 'dict': 7275, ...
Counter({'instancemethod': 9718, 'dict': 7276, ...
Counter({'instancemethod': 9720, 'dict': 7277, ...
然后我尝试识别没有收集垃圾的额外字典,用这个:
def get_latest():
for e in gc.get_objects():
if type(e).__name__ == "dict":
latest = e
return latest
不幸的是,返回的大部分都是相同的(dict1是dict2),所以它不是列表中的最后一个。
有关如何找到泄漏的任何指示将不胜感激。 使用python 2.7和前沿pyglet。
此外,这只会影响游戏的客户端,而不会影响服务器。所以这可能是pyglet中的问题 - 即便如此我想找到它。
编辑:这个问题由我自己解答,我的问题是每帧使用pyglet的push_handlers方法而不是一次。答案 0 :(得分:0)
我的问题是每帧使用pyglet的push_handlers方法而不是一次。删除它,内存泄漏消失了。