【发布时间】:2019-11-04 05:47:19
【问题描述】:
我发现了这个memory leak detection snippet,想知道它产生的内存泄漏。
import gc
def dump_garbage():
"""
show us what's the garbage about
"""
# force collection
print("\nGARBAGE:")
gc.collect()
print("\nGARBAGE OBJECTS:")
for x in gc.garbage:
s = str(x)
if len(s) > 80: s = s[:80]
print(type(x),"\n ", s)
if __name__=="__main__":
import gc
gc.enable()
gc.set_debug(gc.DEBUG_LEAK)
# make a leak
l = []
l.append(l)
del l
# show the dirt ;-)
dump_garbage()
为了测试gc内存泄漏检测,作者自己创建了一个小内存泄漏:
l = []
l.append(l)
del(l)
为什么会导致泄漏?如我所见,我将有一个列表对象,而不是一个嵌套列表对象,其中内部 是 外部,然后删除外部。 gc 不知道要删除对原始列表的所有引用,从而导致内部列表泄露吗?
【问题讨论】:
-
这篇文章是 2001 年的。Python 1.x 仅依靠引用计数进行 GC,循环引用是失败时的教科书示例。 Python 2 引入了一个循环检测步骤,应该可以应对这种情况。还存在一些问题,例如防止 GC 的
__del__方法的存在,但我相信它们也已在 Python 3 的后续版本中得到解决。 -
垃圾仍然在 python 3.x 中显示,所以没有...
-
问题中的sn-p设置了GC_DEBUG_LEAK,这意味着GC_DEBUG_SAVEALL,意思是“所有不可达的对象都会被追加到垃圾中而不是被释放”。如果我运行
python3 -c 'for k in range(1000000000): l = [k]; l.append(l),尽管分配了数百万个循环列表,但进程的大小永远不会超过大约 7 MB。 -
@TurePålsson 我已经删除了错误的答案。但是你可以用你的评论来回答。
标签: python memory-leaks