我在基于c#的WebService中托管IronPython,以便能够提供自定义扩展脚本。但是,当我通过循环重复执行webservice进行简单的负载测试时,我发现内存使用量急剧增加。
IronPython-1.1在其对象上实现了IDisposable,以便您可以在完成后对其进行处理。基于DLR的新型IronPython-2引擎没有这样的概念。
根据我的理解,每次在ScriptEngine中执行脚本时,都会在appdomain中注入一个新程序集,并且无法卸载。
有什么方法吗?
答案 0 :(得分:1)
每次运行IronPython脚本时,都可以尝试创建新的AppDomain。虽然无法从内存中卸载assebmlies,但您可以卸载AppDomain,这样就可以让注入的程序集内存不足。
答案 1 :(得分: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();
}
答案 2 :(得分:0)
事实证明,在aspnet_wp达到约500mb后,垃圾收集器开始并清除混乱。然后内存使用率降至约20mb,并在负载测试期间稳定地再次开始增加。 因此,没有内存“泄漏”。