My guess here (I'm on vacation so I haven't tried this) is that some exception info is not getting cleared -
ExceptionHelpers.DynamicStackFrames = null; In the catch block will probably fix it although we should probably do this ourselves. > -----Original Message----- > From: [email protected] [mailto:users- > [email protected]] On Behalf Of Jonathan Howard > Sent: Tuesday, November 24, 2009 4:45 PM > To: [email protected] > Cc: [email protected] > Subject: [IronPython] Memory Leak in IronPython 2.6 RC3 > > I'm trying to track down a memory leak in our hosted IronPython > application as we upgrade to 2.6 from 1.1.2. I saw a post at > stackoverflow ( http://stackoverflow.com/questions/1664567/embedded- > ironpython-memory-leak > ) showing how to set up the environment to avoid leaking memory, but > we're still having a memory leak. If I take our identical setup code, > and use it on very simple code, there's no problem, but we have > thousands of lines of Python at this point. > > Below is a minimum way to introduce a memory leak inside a hosted > IronPython application. I don't know if it's the only way, or if it's > what's affecting us, but it does cause a leak: (Obviously it needs > the appropriate DLLs etc.) > > ############################################# > > using System; > using System.Threading; > using IronPython.Hosting; > using IronPython.Runtime; > using IronPython.Compiler; > using System.Collections.Generic; > using Microsoft.Scripting.Hosting; > > namespace IPyTest > { > class Program > { > static void Main(string[] args) > { > bool cont = true; > while (cont) > { > var ipy = new IPy(); > try > { > // Set the below boolean to "false" to run without > a memory leak > // Set it to "true" to run with a memory leak. > ipy.run(true); > } > catch { } > } > } > } > > class IPy > { > private string scriptWithoutLeak = "import random; > random.randint(1,10)"; > private string scriptWithLeak = "raise Exception(), 'error'"; > > public IPy() > { > } > > public void run(bool withLeak) > { > //set up script environment > Dictionary<String, Object> options = new > Dictionary<string, object>(); > options["LightweightScopes"] = true; > ScriptEngine engine = Python.CreateEngine(options); > PythonCompilerOptions pco = (PythonCompilerOptions) > engine.GetCompilerOptions(); > pco.Module &= ~ModuleOptions.Optimized; > engine.SetSearchPaths(new string[]{ > @"C:\Program Files\IronPython 2.6\Lib" > }); > ScriptRuntime runtime = engine.Runtime; > ScriptScope scope = runtime.CreateScope(); > var source = engine.CreateScriptSourceFromString( > withLeak ? scriptWithLeak : scriptWithoutLeak > ); > var comped = source.Compile(); > comped.Execute(scope); > runtime.Shutdown(); > } > } > } > _______________________________________________ > Users mailing list > [email protected] > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com _______________________________________________ Users mailing list [email protected] http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
