什么是找到所有的引用在Python对象的好办法?
我想问的原因是,它看起来像我们有一个“内存泄漏”。 我们上传图像文件从Web浏览器服务器。 每次我们这样做的时候,内存使用情况时,舞台上的服务器比例上升到刚刚上传的文件的大小。 该内存是永远不会得到由Python垃圾收集发布,所以我在想,有可能是指向那些没有得到,甚至在每个请求结束时删除或走出去的范围,图像数据杂散引用。
我想,这将是很好能够问蟒蛇:“什么引用仍然指向该内存” 这样我就可以弄清是怎么保持垃圾回收释放它。
目前,我们正在一个Heroku的服务器上运行Python和Django的。
任何的建议和想法表示赞赏,感谢这么多!
Python的标准库有gc
含垃圾收集器API模块。 其中一个功能,你可能想拥有的
gc.get_objects()
该函数返回的所有对象的名单目前由垃圾收集器跟踪。 下一步是分析它。
如果您知道对象要跟踪你可以使用sys
模块的getrefcount
功能:
>>> x = object()
>>> sys.getrefcount(x)
2
>>> y = x
>>> sys.getrefcount(x)
3
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]]]
你可以看到,第一行是l
和d
,而第二行是刚刚l
。
在我简短的实验,我发现,结果并不总是这么干净。 实习字符串和元组,例如,有更多的引荐比你期望的那样。