2009-07-14 57 views
3

gc.get_referrers(obj)應該可以爲對象返回一個空列表,但該對象仍然可以通過弱引用訪問?Python對象沒有引用,但仍然可以通過weakref訪問嗎?

如果是這樣,我將如何開始嘗試確定此對象未被垃圾收集的原因?

編輯:我不確定代碼示例在這種情況下究竟有多大幫助 - 在某處顯然有強烈的引用,但是如果我能找到它,我會被詛咒的。我的印象是,所有對象的強引用都將由get_referrers()來標識。

編輯:已解決。我發現這個變量有一個很強的參考 - 它在遊戲事件循環中,但不是一個類變量,所以get_referrers沒有選擇它。

+0

請舉一個簡單的代碼示例。否則不清楚你的意思。是弱引用本身可訪問還是被引用的對象本身可以通過weakref訪問? – yairchu 2009-07-14 20:35:51

+0

你是如何找到參考變量的?我試圖追蹤這樣一個泄漏,但它是間歇性的,gc.get_referrers返回[]。有沒有辦法找到對象的「本地」引用? – papercrane 2013-04-04 20:43:16

回答

1

是:http://docs.python.org/library/weakref.html

弱引用將不被保留對象活着。

get_referrers()函數將只能找到那些支持垃圾收集的容器;不會發現引用其他對象但不支持垃圾回收的擴展類型。

是什麼讓你覺得對象沒有被收集?另外,你有沒有嘗試過gc.collect()?

+0

當我期望一個None時,我仍然通過weakref得到一個對象實例。 – 2009-07-14 20:35:31

0

由於Christopher says,弱引用不計入對象引用計數,因此無法防止Python刪除對象。

但是,Python的垃圾回收器不會刪除循環引用中的對象並定義了__del__方法。
您可以使用gc.garbage來檢查(並修復)這種情況。

0

如果您確實有強烈的對象引用,請使用gc.get_referrers(obj)來查找它。

這可以幫助,如果您有泄漏,不知道是怎麼泄露:

http://mg.pov.lt/objgraph.py http://mg.pov.lt/blog/hunting-python-memleaks http://mg.pov.lt/blog/python-object-graphs.html

這是檢查模塊周圍瘦包裝;如果您難以追蹤不需要的參考資料,它可以提供很多幫助。但是,只需要追蹤參考,gc.get_referrers可能就是您所需要的。

1

也可能是一個引用被一個錯誤的C擴展泄露,恕我直言,你不會看到引用者,但引用計數仍然沒有下降到0.你可能想要檢查返回值sys.getrefcount

1

我很高興你發現你的問題,與最初的問題無關。儘管如此,如果其他人有這個問題,我對後代的回答有不同的看法。

該對象沒有引用者並且未被垃圾收集是合法的。

來自Python 2。7手冊:「一個實現可以推遲垃圾收集或完全忽略它 - 只要沒有收集到仍然可以訪問的對象,垃圾收集的實現質量就是一個實施質量問題。」

非OP垃圾收集器是合法的。

約代和引用計數的垃圾收集器的討論指的是一個特定的CPython實現(如標記在的問題)

相關問題