Python json.dumps是否泄漏?
使用Python3.6.3下的以下代码,垃圾计数不断增加,任务管理器记录到内存稳步增加 但是,如果没有缩进Python json.dumps是否泄漏?,python,json,memory-leaks,Python,Json,Memory Leaks,使用Python3.6.3下的以下代码,垃圾计数不断增加,任务管理器记录到内存稳步增加 但是,如果没有缩进json.dumps(self.\uu dict\uuu),则不会观察到泄漏 更新:简化代码以突出显示问题。参考: indent=True只是让json使用Python实现而不是C实现。Python实现使用相互引用的闭包。不涉及json的简单示例如下: import gc, json class leak(object): def __init__(self): p
json.dumps(self.\uu dict\uuu)
,则不会观察到泄漏
更新:简化代码以突出显示问题。参考:
indent=True
只是让json使用Python实现而不是C实现。Python实现使用相互引用的闭包。不涉及json的简单示例如下:
import gc, json
class leak(object):
def __init__(self):
pass
gc.set_debug(gc.DEBUG_LEAK)
while True:
leak_ = leak()
json.dumps(leak_.__dict__, indent=True)
gc.collect()
print(f"garbage count: {len(gc.garbage)}")
“泄漏”是由使用gc.set_调试(gc.debug_泄漏)引起的。gc.DEBUG_泄漏包括gc.DEBUG_可收集、gc.DEBUG_不可收集和gc.DEBUG_保存所有
gc.DEBUG\u SAVEALL导致垃圾收集的对象保存在gc.garbage中以供检查。在正常情况下,它们是被收集的
我的回答:
你说得对。后来我意识到我实际上在一个com实例化对象中有一个漏洞,假设它是python中的一个漏洞,并尝试使用gc模块查找它
gc文档引导我走上花园小径
垃圾收集器找到的对象的列表
无法访问但无法释放(无法收集对象)
我假设:
- 循环引用不可访问,但可以释放,因此可以收集
终结器(使用循环引用?)对象无法访问,无法释放,因此无法收集\uuuu del\uuu
import gc
def f():
def g():
return h
def h():
return g
return
gc.set_debug(gc.DEBUG_LEAK)
while True:
f()
gc.collect()
print(f"garbage count: {len(gc.garbage)}")