gpt4 book ai didi

IronPython 内存泄漏?

转载 作者:行者123 更新时间:2023-12-04 02:24:51 24 4
gpt4 key购买 nike

运行这个:

for i in range(1000000000):
a = []

看起来正在创建的列表对象永远不会被标记为垃圾收集。从内存分析器看来,解释器的堆栈帧似乎持有所有列表对象,因此 GC 永远无法对此做任何事情。

这是故意的吗?

编辑:

这是该问题的一个更好的例子。使用内存分析器运行以下代码:
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]
a = [b for b in range(1000000)]

您将看到在列表推导期间分配的内存永远不会被垃圾收集。这是因为创建的所有对象都被 DLR 中的 InterpreterFrame 对象引用。

现在运行这个:
def get():
return [b for b in range(1000000)]

a = get()
a = get()
a = get()
a = get()
a = get()
a = get()
a = get()

在分析器下,您可以看到此处的内存确实按照应有的方式进行了垃圾收集。我猜这是有效的,因为函数的 InterpreterFrame 在函数退出时被清除。

那么,这是一个错误吗?这似乎会导致在 IronPython 脚本的帧(上下文?)内发生一些非常糟糕的内存泄漏。

最佳答案

在构建 IronPython 引擎时尝试设置“LightweightScopes”。这为我解决了很多垃圾收集问题。

var engineOptions = new Dictionary<string, object> { ["LightweightScopes"] = true };
var scriptEngine = Python.CreateEngine(engineOptions);

关于IronPython 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2679404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com