我找到了此内存泄漏检测代码段,并且想知道它生成的内存泄漏。
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 2.x是新的,许多人可能仍在使用Python1.x。
Python 1.x仅依靠引用计数来进行垃圾回收,而循环引用是失败时的教科书示例。Python 2.x添加了一个循环检测步骤,但是仍然存在一些皱纹,例如存在__del__
一种阻塞垃圾收集器的方法,因为它无法确定正确的销毁顺序。从Python 3.4开始,大多数皱纹已被消除。
那么为什么示例代码仍然指示泄漏?它设置GC_DEBUG_LEAK
标志,除其他外,该标志明确地告诉垃圾收集器将无法访问的对象保持在周围!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句