Setting Image to null is not good enough.  Call load(null) on the Image before 
removing it from the display list and releasing references to it.

GC() is not deterministic.  The only ways to test are to use the profiler, or 
run the app over thousands of actions and see if you eventually reach a stable 
number.

System.totalMemory does not measure memory used by the browser and OS to 
actually render things and the "shrinks memory when minimized" problem has been 
seen before and is under investigation by the player team.  Also, the 
debugger/profiler player can leak memory that isn't always shown in the 
profiler but may show up in System.totalMemory.

But, System.totalMemory is the high-water mark.  It is rare for pages to be 
released because of the way the player allocates memory, so it is always best 
not to create stuff that you don't need.

Also, make sure you're on the latest player 9.  The final test is to run your 
app over thousands of iterations on a release player with a release SWF and see 
if it eventually reaches a stable browser process memory number.  Using debug 
SWFs or debugger player in such a test will skew results.

From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of 
andrii_olefirenko
Sent: Wednesday, October 29, 2008 8:01 AM
To: [email protected]
Subject: [flexcoders] Re: Memory issues ... garbage collection only running in 
IE (not FF or Safari)


i still think that you could re-use window instances. After all, how
many windows a regular human being is capable to deal with at one time
- 7, 12,25? You just create a pool of instances and there will be
*zero* startup time for the window and *zero* memory increase.
Otherwise, you would need to create unlimited number of instances.

When I was a little boy and programmed in Borland Delphi, I came up
with the same idea for my applications - and i think this approach is
still valid for Flex stuff :)

Flex components by design are not light. for example, they could be
references in static variables (i guess), which could prevent some
objects from garbage collecting. There are "item renderers", they are
designed to be numerous, but even they, they are cached by components
like datagrid, list, etc.

--- In [email protected]<mailto:flexcoders%40yahoogroups.com>, 
"e_baggg" <[EMAIL PROTECTED]> wrote:
>
> My original mxml was a bad example I guess. In my application, which
> is a Flex app that has its own windowing (exactly like Windows)...when
> I add and create Windows and close them, the browser CPU memory always
> increments (except for IE when I minimize the browswer window and
> memory is restored). When using System.totalMemory, I see some memory
> gets cleaned up but not all of it and if I open and close the same
> window multiple times, it is inconsistent to how much memory is given
> back to the Player, but either way it continually increments. I use
> weakReferences everywhere and call removeAllChildren() on the toplevel
> containers and set the viewComponent to null when removing the
> Mediator from the Facade (PureMvc). But yeah, when using Profiler,
> which forces a gc(), all memory is correctly restored back the player.
> Just not in runtime. The hunt continues...
>
> --- In [email protected]<mailto:flexcoders%40yahoogroups.com>, 
> "andrii_olefirenko" <andriyo@>
> wrote:
> >
> > i've tried your example and didn't notice any memory leakage.
> > anyway, why do you need to create components and remove them, and
> > create again the same components? It looks like you made up an
> > artificial problem for yourself :)
> >
> >
> > --- In [email protected]<mailto:flexcoders%40yahoogroups.com>, 
> > "e_baggg" <e_baggg@> wrote:
> > >
> > > So I have an app in production which after 10 minutes of usage
> began
> > > to perform EXTREMELY slow, and users had to restart the app. (Flex
> 3)
> > > Windows and Mac...all browsers. I did some Profiling and did not
> get
> > > far. Whenever I take a Memory Snapshot, gc() is forced and all my
> > > objects are correctly removed from memory. So why are they not
> gc()'d
> > > in normal runtime?? I know gc() only runs when new memory is
> requested
> > > and nothing is being drawn/rendered. Both seem to be OK on my
> side.
> > >
> > > I have read extensively all the blogs and Adobe docs regarding
> this
> > > issue, including the event listener for ENTER_FRAME which calls
> > > System.gc() twice. (http://www.craftymind.com/2008/04/09/kick-
> > > starting-the-garbage-collector-in-actionscript-3-with-air/). This
> > > unfortunately did not work for me.
> > >
> > > To simplify, I created a simple app that adds and removes RichText
> > > fields. if I create 50 of them, then remove them all, then Add one
> > > back, that *should* force a gc() but it does not. The FF memory
> always
> > > stays high. I noticed in IE, minimizing the browser window causes
> a
> > > gc() and my memory drops to a much lower #.
> > >
> > >
> > > Has anyone seen or come across this? B/c of this issue, we're
> pretty
> > > much going to lose our customers and try to wing a html/ajax app
> > > ASAP..so I'm scrambling to resolve this.
> > >
> > > Thanks in advance for any help.
> > >
> > > <?xml version="1.0" encoding="utf-8"?>
> > > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
> > > creationComplete="init()" layout="vertical" >
> > > <mx:Script>
> > > <![CDATA[
> > > import mx.controls.RichTextEditor;
> > >
> > > private function removeit():void
> > > {
> > > this.removeChildAt(2);
> > > }
> > >
> > > private function doit():void
> > > {
> > > var rte : RichTextEditor = new
> > > RichTextEditor();
> > > rte.width=300;
> > > rte.height=150;
> > > this.addChild(rte);
> > > }
> > > ]]>
> > > </mx:Script>
> > > <mx:Button click="doit()" label="Add"/>
> > > <mx:Button click="removeit()" label="Remove"/>
> > > </mx:Application>
> > >
> >
>

Reply via email to