Во время разработки проекта, над которым я работал, я работал над проблемой, с которой я столкнулся с проблемой сборщика мусора, неспособного де-выделить связанные списки или даже списки.Сборщик мусора не освобождает связанные объекты (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. объекты не существуют, но для них выделена память.
Однако эта проблема возникает только тогда, когда экземпляры связаны. Если экземпляры не имеют ссылки на другие. Сборщик мусора ведет себя нормально.
Любая идея, почему?
В приведенном выше коде после 'del l [:]' ваш полный список по-прежнему доступен через ссылки 'b' и' prev'. – sebastian