2015-11-04 26 views
5

我試圖調試爲什麼不被垃圾回收我的對象之一,我有試圖去通過文檔/前面的問題的幾個問題:垃圾收集在Python和引用計數

1)如果我的對象不參與任何引用循環,我是否正確地認爲垃圾收集沒有涉及,並且當對象的引用計數下降到0時,Python只是釋放內存?

2)當這樣一個簡單的對象的引用計數達到0時,是立即釋放的存儲器,如果不是,是有辦法迫使它被釋放?

3)使用Python sys.getrefcount(OBJ)跟蹤的引用計數?

4)爲什麼沒有下面的代碼段1至2(它打印1既倍)增加引薦的數量?

import gc 
a = [] 
print(len(gc.get_referrers(a)) 
b = a 
print(len(gc.get_referrers(a)) 
+0

https://medium.com/python-pandemonium/cpython-memory-management-479e6cd86c9 – codefire

回答

2

1)是的,你說得對。你甚至可以禁用GC如果你確定你的代碼不包含參考週期:https://docs.python.org/2/library/gc.html

由於收集補充了 Python中已經使用引用計數,您可以禁用收集器,如果你確信你的程序 不會創建參考週期。通過調用gc.disable()可以禁用自動收集 。

2)如果要強制收集階段,你可以簡單的調用collect

3)sys.getrefcount(OBJ)包括參考函數的參數,不知道這是否回答你的問題

4)get_referrers的回報是不是一個簡單的列表,它包含引用您的對象字典的列表。 嘗試打印完整的回報,你會碰到這樣的:

[{'a': [], 'b': [], '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'yourfile.py', '__package__': None, 'gc': <module 'gc' (built-in)>, 'x': {...}, '__name__': '__main__', '__doc__': None}] 

你可以看到你的對象的所有引用在詞典中的元素。

+0

完美!我仍然不清楚的唯一的事情是2和3.如果我的對象沒有引用週期,如果引用計數爲零,gc.collect是否會釋放內存?感謝您的澄清4.現在我發現,B = A增加引薦的個性化......但我得到10個對象,然後11.因此,當文檔中說,當「引用計數」降至0內存被釋放,什麼是正確的方式來得到什麼引用計數是什麼?剩下的最後一個問題是,你保證沒有參考週期的對象一旦引用計數下降到0就會被釋放掉嗎? – Dan