[英]Garbage collector doesn't deallocate linked objects (Linked Lists memory leak)
在開發項目期間,我一直在努力,但是我一直在遇到垃圾回收器無法解除分配鏈表甚至鏈表的問題。
class B(object):
def __init__(self, previous):
self.previous = previous
def __del__(self):
self.previous = None
self = None
import gc
gc.set_debug(gc.DEBUG_LEAK)
l = []
prev = None
for i in range(1000000):
b = B(prev)
l.append(b)
prev = b
del l[:]
gc.collect()
print gc.garbage
當我在分配之前,分配之后和刪除之后檢查內存使用情況時。 分配后的內存使用情況仍然與刪除后的內存使用情況相同。 並且垃圾收集器不會抱怨任何內存泄漏。
當我使用pympler跟蹤python環境中的對象時。 對象不存在,但為它們分配了內存。
但是,僅在鏈接實例時才會出現此問題。 如果一個實例之間沒有相互引用。 垃圾收集器的行為正常。
知道為什么嗎?
您可能已經清除了l
,但是b
和prev
仍然引用最后創建的B
實例。 反過來,該實例引用先前創建的實例,以此類推。使整個鏈保持活動狀態:
>>> class B(object):
... def __init__(self, previous):
... self.previous = previous
... def __del__(self):
... self.previous = None
... self = None
...
>>> l = []
>>> prev = None
>>> for i in range(1000000):
... b = B(prev)
... l.append(b)
... prev = b
...
>>> del l[:]
>>> prev
<__main__.B object at 0x11f269d50>
>>> b
<__main__.B object at 0x11f269d50>
>>> b.previous
<__main__.B object at 0x11f269d10>
>>> import gc
>>> sum(1 for ob in gc.get_objects() if isinstance(ob, B))
1000000
>>> del b, prev
>>> sum(1 for ob in gc.get_objects() if isinstance(ob, B))
0
如果有循環引用,則gc.garbage
列表將僅列出B
實例; 例如,如果鏈中的最后一個B
實例引用了同一鏈中的另一個實例,而不是None
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.