У меня есть программа, написанная на python 2.6, которая создает большое количество кратковременных экземпляров (это классическая проблема производитель-потребитель).Я заметил, что использование памяти, сообщаемое top и pmap, кажется, увеличивается при создании этих экземпляров и никогда не возвращается обратно.Я был обеспокоен тем, что какой-то модуль Python, который я использовал, мог пропускать память, поэтому я тщательно изолировал проблему в своем коде.Затем я продолжил воспроизводить его как можно более кратким примером.Я придумал это:
class LeaksMemory(list):
timesDelCalled = 0
def __del__(self):
LeaksMemory.timesDelCalled +=1
def leakSomeMemory():
l = []
for i in range(0,500000):
ml = LeaksMemory()
ml.append(float(i))
ml.append(float(i*2))
ml.append(float(i*3))
l.append(ml)
import gc
import os
leakSomeMemory()
print("__del__ was called " + str(LeaksMemory.timesDelCalled) + " times")
print(str(gc.collect()) +" objects collected")
print("__del__ was called " + str(LeaksMemory.timesDelCalled) + " times")
print(str(os.getpid()) + " : check memory usage with pmap or top")
Если вы запустите это с чем-то вроде 'python2.6 -i memoryleak.py', оно остановится, и вы можете использовать pmap -x PID для проверки использования памяти.Я добавил метод del , чтобы убедиться, что GC происходит.Его нет в моей реальной программе и, похоже, не имеет никакого функционального значения.Каждый вызов leakSomeMemory () увеличивает объем памяти, используемой этой программой.Боюсь, что я делаю какую-то простую ошибку, и ссылки хранятся случайно, но не могу ее идентифицировать.