有什麼辦法可以手動刪除垃圾收集拒絕擺脫的對象,即使我打電話給gc.collect()
?在Python 3.0中工作Python中的手動垃圾收集
回答
每the docs,gc.get_referrers(thatobject)
會告訴你爲什麼對象還活着(做一個gc.collect()
之後,以確保不想要的「活躍度」會持續)。之後,這是某種黑色藝術;-)。你會經常發現一些引用者是列表(所以爲什麼這個列表指的是thatobject
?你可以.remove
它在緊急模式下,但使正常代碼的聲音更好......),更常見的是, (其中許多可能是__dict__
s的某些類別實例或其他 - 往往不是無足輕重以找出哪一個...再一次,蠻力拆除有時是一種便捷的緊急解決方案,但從來沒有一個可持續的遠程解決方案! - )。
這取決於你的Python運行的是什麼。 Here's good article解釋細節
報價:
在CPython中的當前版本,每一個新的分配x的循環中會釋放先前分配的資源。使用GC,這不能保證。如果你想編寫能夠與任何Python實現一起工作的代碼,你應該明確地關閉資源;這將工作不管GC:
for name in big_list:
x = Resource()
do something with x
x.close()
如果GC拒絕銷燬它,這是因爲你有一個引用它的地方。擺脫參考,它會(最終)去。例如:
myRef = None
請記住,GC可能不一定摧毀你的目標,除非它需要。
如果你的對象所持有的資源不在Python的管理之下(例如,一些C代碼調用的詭計),對象應該提供一個資源釋放調用,所以你可以在需要時執行它,而不是在Python決定時。
del
或者None
是你只有朋友
>>> a = "Hello"
>>> a = None
Or
>>> del a
不一定正確。該對象只需要無法訪問(或者有一個合意的一次性可重複計數,這非常有希望與前者一致)有資格進行回收。 – 2009-10-29 05:17:59
'del a'不會刪除該對象(只是一個註釋;並不意味着您暗示) – hasen 2009-10-29 05:25:57
- 1. Android活動垃圾收集
- 2. 自動垃圾收集
- 3. Python + Numpy:什麼時候手動收集垃圾有用?
- 4. bash中的垃圾收集
- 5. 垃圾收集java
- 6. Java垃圾收集
- 7. Java垃圾收集
- 8. C#垃圾收集
- 9. GWT垃圾收集
- 10. DoctrineCommonCache垃圾收集?
- 11. 垃圾收集器
- 12. Python的C和垃圾收集
- 13. Android中的手動垃圾收集是否必要?
- 14. Python垃圾回收
- 15. Objective-C的垃圾收集
- 16. 數量的垃圾收集
- 17. Node.js的垃圾收集器
- 18. 的Java newSingleThreadExecutor垃圾收集
- 19. dalvik vm的垃圾收集
- 20. 垃圾收集的OutOfMemoryError
- 21. 移動垃圾收集器的成本
- 22. 可以手動從收集中刪除Silverlight 2.0頁面(垃圾收集)嗎?
- 23. 延遲垃圾收集?
- 24. 瞭解Actionscript垃圾收集
- 25. Android - 檢測垃圾收集
- 26. Renderscript和垃圾收集器
- 27. JavaScript垃圾收集暫停
- 28. .NET垃圾收集器
- 29. 結構和垃圾收集
- 30. 類垃圾收集任務
不知道Python,但有些垃圾收集器有時會錯誤地認爲事物仍在使用中,因爲他們發現*出現*是引用這些對象(但實際上不是)。在這種情況下,你可以做的事情不多。 – Artelius 2009-10-29 05:37:29
另外,您應該儘快轉移到Python 3.1。 3.0有一些已知的問題,不再支持。 – 2009-10-29 07:12:31
只要我完成榮譽,我打算。 – Casebash 2009-10-29 09:07:54