查找在Python对象的所有引用(Find all references to an object

2019-06-26 22:33发布

什么是找到所有的引用在Python对象的好办法?

我想问的原因是,它看起来像我们有一个“内存泄漏”。 我们上传图像文件从Web浏览器服务器。 每次我们这样做的时候,内存使用情况时,舞台上的服务器比例上升到刚刚上传的文件的大小。 该内存是永远不会得到由Python垃圾收集发布,所以我在想,有可能是指向那些没有得到,甚至在每个请求结束时删除或走出去的范围,图像数据杂散引用。

我想,这将是很好能够问蟒蛇:“什么引用仍然指向该内存” 这样我就可以弄清是怎么保持垃圾回收释放它。

目前,我们正在一个Heroku的服务器上运行Python和Django的。

任何的建议和想法表示赞赏,感谢这么多!

Answer 1:

Python的标准库有gc含垃圾收集器API模块。 其中一个功能,你可能想拥有的

gc.get_objects()

该函数返回的所有对象的名单目前由垃圾收集器跟踪。 下一步是分析它。

如果您知道对象要跟踪你可以使用sys模块的getrefcount功能:

>>> x = object()
>>> sys.getrefcount(x)
2
>>> y = x
>>> sys.getrefcount(x)
3


Answer 2:

Python的gc模块有几个有用的功能,但它听起来像是gc.get_referrers()是你在找什么。 下面是一个例子:

import gc


def foo():
    a = [2, 4, 6]
    b = [1, 4, 7]

    l = [a, b]
    d = dict(a=a)
    return l, d

l, d = foo()
r1 = gc.get_referrers(l[0])
r2 = gc.get_referrers(l[1])

print r1
print r2

当我跑,我看到下面的输出:

[[[2, 4, 6], [1, 4, 7]], {'a': [2, 4, 6]}]
[[[2, 4, 6], [1, 4, 7]]]

你可以看到,第一行是ld ,而第二行是刚刚l

在我简短的实验,我发现,结果并不总是这么干净。 实习字符串和元组,例如,有更多的引荐比你期望的那样。



文章来源: Find all references to an object in python