2

我在基于 ac# 的 WebService 中托管 IronPython,以便能够提供自定义扩展脚本。但是,我发现当我通过在循环中重复执行 web 服务进行简单的负载测试时,内存使用量急剧增加。

IronPython-1.1 在它的对象上实现了 IDisposable,这样你就可以在它们完成后处理它们。基于 DLR 的新 IronPython-2 引擎没有这样的概念。

据我了解,每次您在 ScriptEngine 中执行脚本时,都会在 appdomain 中注入一个新程序集并且无法卸载。

有没有办法解决?

4

3 回答 3

1

每次运行 IronPython 脚本时,您都可以尝试创建一个新的 AppDomain。尽管无法从内存中卸载程序集,但您可以卸载 AppDomain,这将允许您将注入的程序集从内存中取出。

于 2009-03-04T17:28:45.520 回答
1

您需要禁用优化的代码生成:

var runtime = Python.CreateRuntime();
var engine = runtime.GetEngine("py");
PythonCompilerOptions pco = (PythonCompilerOptions)engine.GetCompilerOptions();
pco.Module &= ~ModuleOptions.Optimized;

// this shouldn't leak now
while(true) {
   var code = engine.CreateScriptSourceFromString("1.0+2.0").Compile(pco);
   code.Execute();
}
于 2009-03-05T02:03:57.887 回答
0

事实证明,在 aspnet_wp 达到大约 500mb 之后,垃圾收集器就会启动并清理掉这些乱七八糟的东西。然后内存使用量下降到大约 20mb 并在负载测试期间再次稳定地开始增加。所以没有这样的内存“泄漏”。

于 2009-03-05T04:03:28.460 回答