2012-08-09 63 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

相關問題