2009-03-04 125 views
2

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

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

从我所了解的情况来看,每次在ScriptEngine中执行脚本时,都会在appdomain中注入一个新程序集,并且无法卸载。

有没有办法解决这个问题?

回答

0

事实证明,去的aspnet_wp约500MB后,在垃圾收集器踢和清理出来的烂摊子。内存使用量下降到20mb左右,并在负载测试期间稳步开始增加。因此,这里没有记忆“泄漏”。

+0

您对我去年向IP团队提交的问题感兴趣。 http://www.mail-archive.com/[email protected]/msg05771.html – Sake 2009-05-30 23:36:54

1

每次运行一个IronPython脚本时,都可以尝试创建一个新的AppDomain。虽然不能从内存中卸载断言,但可以卸载AppDomain,这将允许您从内存中获取注入的程序集。

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(); 
}