Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python json.dumps是否泄漏?_Python_Json_Memory Leaks - Fatal编程技术网

Python json.dumps是否泄漏?

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

使用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):
        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)}")