[英]Python: logging the garbage collector
我有一個python應用程序,該應用程序有一些性能問題。 我想將垃圾收集器的事件(尤其是何時調用)添加到我的日志中。 可能嗎?
謝謝。
http://docs.python.org/library/gc.html#gc.set_debug
您可以設置標志,但是它們會寫入stderr。
可用的標志是
gc.DEBUG_STATS
gc.DEBUG_COLLECTABLE
gc.DEBUG_UNCOLLECTABLE
gc.DEBUG_INSTANCES
gc.DEBUG_OBJECTS
gc.DEBUG_SAVEALL
gc.DEBUG_LEAK
也
在處理性能時,您可能希望分析代碼以進行詳盡的循環或函數調用。 您可以使用cProfile
或hotshot
。 此處更多http://docs.python.org/library/profile.html
Python(至少CPython版本2.x)使用引用計數來實現其垃圾收集器(請參閱Java和Python垃圾收集方法為何不同? ),因此它並不是像Java中那樣真正被“調用”。
Refcounting
意味着每次創建對給定對象的新引用時,都會增加一個計數器,而每次丟失引用時(范圍結束,重新分配等),該計數器都會減少。 當達到0時,對象存儲器被釋放。
因此,Python為您提供的解決方案是重寫對象的__del__
方法:
class test:
def __del__(self):
#self is about to be freed, do what ever you want
pass
編輯:根據上面的鏈接,還有另一種機制定期運行:
CPython(引用計數不是python本身的一部分,而是其C實現的一部分)使用單獨的垃圾收集例程捕獲循環引用,該例程定期運行...
但僅在循環引用的情況下涉及。
編輯2:如評論和此處所述 , __del__
不是最安全的解決方案。 這是實現類似行為的肯定更好的方法:
import weakref
class test:
pass
t = test()
def prepare_cb(obj):
#save information about the obj
uid = id(obj)
def do_some_logging(weak):
print "Object %s cleaned up" % uid
return do_some_logging
weak = weakref.ref(t, prepare_cb(t))
del t
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.