簡體   English   中英

垃圾收集器不會取消分配鏈接的對象(“鏈接的列表”內存泄漏)

[英]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 ,但是bprev仍然引用最后創建的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.

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