0

在一个非常大的项目中,我正在寻找内存泄漏。到目前为止,我的进展如下:

使用类计数器,

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 方法,而不是一次。

4

1 回答 1

0

我的问题是每帧都使用 pyglet 的 push_handlers 方法,而不是一次。删除它,内存泄漏就消失了。

于 2012-08-09T10:45:40.913 回答