2012-08-09 87 views
15

什么是在python中查找所有对象引用的好方法?查找对python中所有对象的引用

我问的原因是它看起来像我们有“内存泄漏”。我们正在从Web浏览器上传图像文件到服务器。每次我们这样做时,服务器上的内存使用量都会与刚上传的文件大小成比例地增加。这种内存永远不会被python垃圾回收系统释放,所以我认为,即使在每个请求结束时,可能存在指向图像数据的杂散引用,这些引用不会被删除或超出范围。

我认为能够问python会很好:“哪些引用仍然指向这个内存?”这样我就可以弄清楚什么是让垃圾收集解放它。

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

任何建议和想法表示赞赏,非常感谢!

+0

http://stackoverflow.com/questions/1339293/python-memory-leak-debugging – 2012-08-09 20:53:28

+0

你看过这个:http://stackoverflow.com/questions/110259/python-memory-profiler – 2012-08-09 20:53:44

回答

10

Python的标准库有gc模块包含垃圾回收器API。您可能想要的功能之一是

gc.get_objects() 

此函数返回垃圾回收器当前跟踪的所有对象的列表。下一步是分析它。

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

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

sys.getrefcount ()是有用的,但有什么方法可以看到这些引用是什么? – RAAC 2015-09-10 16:05:13

12

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

在我的简短实验中,我发现结果并不总是那么干净。例如,Interned字符串和元组拥有比您预期的更多的引用。

+1

这似乎是最简单和最好的答案。 – 2017-12-18 19:42:31

相关问题