簡體   English   中英

Python:記錄垃圾收集器

[英]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

在處理性能時,您可能希望分析代碼以進行詳盡的循環或函數調用。 您可以使用cProfilehotshot 此處更多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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM