Sorry, I wasn't paying attention -- I had put the code in there prior to the issue about __del__ being raised. The leak is now gone in my testing. Thanks. Anthony
On Saturday, January 8, 2011 10:43:13 AM UTC-5, Massimo Di Pierro wrote: > The change in trunk fixes the problem for every class that does not > have a __del__ attribute. Classes that have a __del__ attribute may > cause a memory leak (on cpython, not on jython). > > > On Jan 7, 11:41 pm, Anthony <[email protected]> wrote: > > As far as I can tell, the change in trunk didn't have any effect for me. > I'm > > on Windows 7 with Python 2.7.1 (just using the built-in Rocket server). I > > > added the following code to the top of default.py (outside any functions) > in > > the welcome app: > > > > class Foo(object): > > def __del__(self): > > pass > > foo = Foo() > > foo.payload = [1] * 1000000 > > > > I then load the index page of the welcome app and start watching my > > python.exe process memory in the Windows Task Manager. Every time I > reload > > the page (by hitting F5), the memory increases by about 7MB, which is > > exactly the same behavior I observe when running the same experiment in > > 1.91.6 (i.e., before gc was added). These large memory increases do not > > occur when I remove the above code from default.py. Am I doing something > > wrong? > > > > I'm also wondering if there may be a small memory leak either in the > > framework or the welcome app, even without the above code. I notice that > > when I reload the welcome app index page (without the above code), I > still > > get small memory increases, on the order of a few KB per reload. It's not > > > consistent -- sometimes a few KB, sometimes a bit more, sometimes no > > increase at all -- but memory does consistently creep up as I keep > reloading > > (both in trunk and in 1.91.6). Is that expected behavior? > > > > Thanks. > > > > Anthony > > > > On Friday, January 7, 2011 7:56:51 PM UTC-5, Massimo Di Pierro wrote: > > > > > > > > > > > > > > > > > Mitsuhiko on reddit brings up a good issue that I was not aware of: a > > > bug in exec. > > > > > code=""" > > > class Foo(object): > > > def __del__(self): > > > pass > > > foo = Foo() > > > """ > > > while True: exec code in {} > > > > > causes a memory leak. Web2py does this. The memory leak is small in > > > practice and in fact nobody noticed it. Yet it is a concern, in > > > theory. > > > > > So far I have the current solution > > > > > code=""" > > > class Foo(object): > > > def __del__(self): > > > pass > > > foo = Foo() > > > """ > > > import gc > > > while True: > > > exec code in {} > > > gc.collect() > > > > > It works for me and I cannot reproduce the leak. > > > I patched trunk with this. Give it a try and let me know what you > > > think. > > > > > Massimo

