我有一個用python 2.6編寫的程序,它創建了大量的短期實例(這是一個典型的生產者 - 消費者問題)。我注意到,top和pmap報告的內存使用量在創建這些實例時似乎會增加,並且永遠不會回落。我擔心我使用的一些python模塊可能會泄漏內存,所以我仔細隔離了代碼中的問題。然後,我儘可能以儘可能簡短的方式重現它。我想出了這個:Python 2.6似乎GC清理對象,但內存不釋放
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()都會增加此程序消耗的內存量。我擔心我會犯一些簡單的錯誤,並且引用會被意外保存,但無法識別。
如果等待一段時間,並在內存消耗回去了嗎?我的理解是,Python從池中分配出來,所以如果它必須擴大池,它可能不會在將內存釋放回池之後立即收縮。 – 2011-02-09 19:15:35