在一个非常大的项目中,我正在寻找内存泄漏。到目前为止,我的进展如下:
使用类计数器,
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 方法,而不是一次。