in reply to Memory leak
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Memory leak
by aplonis (Pilgrim) on Jan 14, 2005 at 03:29 UTC | |
The editor is for automotive test equipment such as you see rattling cars in TV commercials. They run on road load data files, recordings from the test track. My editor is described and downloadable via this link. I do open and close a fair number of windows. To close, I destroy them at top-level like so... Thanks, | [reply] [d/l] |
by BrowserUk (Patriarch) on Jan 14, 2005 at 04:21 UTC | |
I downloaded and ran your program and it produced a bunch of warnings. Most of them are probably benign, at leats with respect to your memory problem, but one group caught my eye and tweaked somthing in my memory:
The diagnostics for this warning reads:
I wonder, without being able to find anything to confirm it, if these unshared closures are causing (part of) your memory leak. As I say, I'm not sure if this could cause such a problem as I have never really understood the diagnostic, but it might be worth your further investigation. Examine what is said, not who speaks.
Silence betokens consent.
Love the truth but pardon error.
| [reply] [d/l] [select] |
by demerphq (Chancellor) on Jan 14, 2005 at 09:55 UTC | |
Maybe the following will help (and yes im pretty sure this is at least part of the reason for his leak):
T only once shares the same $foo with F, right at the beginning. The first time the sub executes it binds T as a closure to the original $foo and never rebinds it. And since T contains a reference to that $foo, and because T exists in the package table $foo wont be freed until T is destroyed causing $foo's refcount to drop. Thus the OP probably has a number of vars that are filling up without his knowledge behind the scenes. When the inner sub is anonymous, the compiler knows that the closure must be re-resolved each time.
--- demerphq | [reply] [d/l] |
by BrowserUk (Patriarch) on Jan 14, 2005 at 10:12 UTC | |
by aplonis (Pilgrim) on Jan 15, 2005 at 02:49 UTC | |
Yes, indeed. Those were problems, fixed now. For some reason I'd commented out the "use warnings" for some temporary reason and forgotten to turn it back on. I think the majority of my memory leak originated from that as fixing them all had good effect prior to any serious attempt with TK's "withdraw" and "raise" methods. My memory use now climbs up rapidly until the largest file has passed through the editor in auto-edit mode. Then it climbs only ever so very slowly with fifty or more windows being destroyed/re-created as per the other suggestion. Thanks much, | [reply] |
by zentara (Cardinal) on Jan 14, 2005 at 14:07 UTC | |
That's your problem. I was burned by the same thing when I built my first "big-long-running" script. If there is one rule I can summarize...you have to REUSE all widgets in Tk, or there will be leaks. Somewhere deep down in the innards of Tk, references to all objects are kept, and not released until the end of the program. I know it is a pain to deal with, but once you learn the tricks, it isn't too bad. For instance, you say you open a fair number of windows, then destroy them....that is memory use going up. What you want to do, is pre-create a set of reusable top-level windows, each packed with the widgets they need (which will also be reused), and "withdraw" them. Now, when you need to load them with data, loop through them all, and "configure" each of them with the new data, then "raise" the toplevel. When you are done, don't destroy the toplevel, just "withdraw" it. When you need the next toplevel, just loop through the withdrawn toplevel(and it's widgets) and "reconfigure" them with the new data, then "raise" them again. I have made some big programs run this way, loading, unloading, and reloading data, without memory leaks. The memory will increase to the size of the largest "instance" of the toplevel, but will be reused, and generally will level out at some average value. Photo objects can be "emptied" with $photo->blank, text widgets can be blanked with $text->delete('1.0', 'end'); etc, etc. I've found almost all widgets can be reused, without leaking, with the exception of the Progressbar. Most Tk apps are small, and tend to do something then exit; so the small memory gains, created by using "destroy", can be ignored. But long running scripts have to be caarefully planned. I'm not really a human, but I play one on earth. flash japh | [reply] |
by aplonis (Pilgrim) on Jan 14, 2005 at 18:11 UTC | |
Thank you, that would certainly explain it as a couple of the top-level windows get dragged to full-screen. And I've been destroy-ing those regularly. Sometimes I automate the whole sequence for many a file so that destroy might happen a hundred times. A couple of times I thought I'd crashed the OS...with 4GB...but now that I recall it seems as if only X-windows had locked. So it's the GUI not the OS which crashed, I guess. | [reply] [d/l] [select] |
by zentara (Cardinal) on Jan 15, 2005 at 13:10 UTC | |