Hi again,
Thanks a lot for your time and help.
But still something that I can't understand.

The property object options has 3 variables inside:

 this.options = {
            vari: '',
            array: '',
            testDiv: ''
        };

What I can't understand is that for "vari" and "testDiv" is releasing
the memory.

You can use this program http://home.orange.nl/jsrosman/ to see the
memory and the DOM elements used and you'll see how after the destroy
1 node is released, the node for the "testDiv" variable.

So, why is deleting this variable and not the array? it sounds very
strange for me.

Thanks a lot for your help!!

Kr, Jose

On 22 oct, 18:20, "T.J. Crowder" <t...@crowdersoftware.com> wrote:
> Hi,
>
> Sorry, all of the numbers in my original post are off by 1,000. I was
> writing "32k" when I should have been writing "32,000k" (or ~31M).
> Sorry about that, misread the Chrome memory page and failed to
> think. :-)
>
> > But the problem is still there, I don’t know how to release the memory
> > used by this.options, using your code, the variable is using almost
> > 450 MB in explorer and this memory is never released.
>
> There's something different in your setup, then. When I ran that test
> page on my Windows 7 box, IE8 released the memory *much* more
> aggressively than that, it never once went above about 57M. You're
> really seeing 450MB of memory consumed using the test pages I posted?
>
> Later: I've had IE8 open and runninghttp://pastie.org/1240613for
> about 25 minutes. It's done 4,180 loops, and so created and released
> ~8,364,180 divs (4,180 x 2,001). It's cycling between about 30M and
> 50M, which is what it's been doing since I started it. It's very
> nearly steady-state, as close to it as I would expect since I'm using
> a version of the code that's keeping the TestObject instances (which
> won't account for more than a few hundred k). No evidence of a memory
> leak at all.
>
> > So, do you have any idea on how to release the memory?
>
> Just what I said above: *You* can't release the memory, you can only
> release your references to it (which you are). It's up to IE to
> actually reclaim it, _if_ and _when_ it thinks it should. JavaScript
> is a garbage-collected[1] environment.
>
> > I really need
> > to know how to delete a global variable like this.options
>
> It's not a global variable, it's a property on an object. You delete
> it exactly as you originally tried to:
>
>     delete this.options;
>
> At that point, it's down to the JavaScript implementation (IE's
> JScript, in this case) to actually release the memory.
>
> In terms of actually dealing with the problem you're seeing, I hate to
> say it, but it sounds like you're probably not going to get a quick
> fix. :-( You'll have to audit the code, ensure there are no circular
> references anywhere (which _will_ cause memory leaks), make sure you
> don't have references being kept active by closures (you don't in your
> example code, but as we've said, that was just test code), etc.
>
> [1]http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
>
> Good luck,
> --
> T.J. Crowder
> Independent Software Engineer
> tj / crowder software / com
> www / crowder software / com
>
> On Oct 22, 3:02 pm, jose maria Cano <josemaria.c...@gmail.com> wrote:
>
>
>
>
>
>
>
> > Hi,
> > First of all, thanks a lot for your time and help.
>
> > I forgot to say that the problem is using windows and IE8 (of course…)
> > but I have to support IE for some clients.
> > Also, the class is a test class, is not doing anything “useful”, is
> > just to see how to release the memory in IE, the real application is a
> > huge application with thousands of nodes, variables, events… and after
> > 30 minutes working on IE you have like 500 MB used.
>
> > I’ve been making some tests with your code and indeed the memory used
> > is the same doing null to the whole array or just doing delete
> > this.options
>
> > But the problem is still there, I don’t know how to release the memory
> > used by this.options, using your code, the variable is using almost
> > 450 MB in explorer and this memory is never released.
>
> > I don’t know how to attach a screenshot here to show you the memory….
>
> > So, do you have any idea on how to release the memory? I really need
> > to know how to delete a global variable like this.options and for the
> > moment I don’t see how to it…..
>
> > Thanks a lot for your time
>
> > kr, Jose
> > On 22 oct, 14:59, "T.J. Crowder" <t...@crowdersoftware.com> wrote:
>
> > > Hi,
>
> > > > I have a big problem in my application, when I create a global class
> > > > object is impossible for me to release the memory and I'm having
> > > > memory leaks.
>
> > > It looks to me like you're doing nearly everything you need to do (and
> > > a little bit more). Remember that all you can do is make sure that
> > > memory is no longer referenced (which it looks to me like you've done
> > > almost completely) and that you've broken any _circular_ references
> > > between DOM elements and JavaScript objects (you don't have any
> > > circular references, but you've broken all refs from JavaScript->DOM,
> > > which is a good thing to do). At that point, it's up to the JavaScript
> > > implementation when (and whether) to actually reclaim the memory. Some
> > > are more aggressive than others, and some are more effective than
> > > others.
>
> > > Your actual quoted code ends up being very nearly a no-op, which I'm
> > > guessing is for testing purposes. It creates 2,000 divs and pushes
> > > them on an array (and another div it puts in a property) but never
> > > adds them to the document. It then removes the references to them from
> > > the array and releases the array (and clears the property). Assuming
> > > this code:
>
> > >     var t = new TestClass();
>
> > > ...by the time the line above is complete, the only remaining memory
> > > references I see are the instance itself (`t` above) and the fact that
> > > `t` has a property called `options` (which has the value null). If you
> > > uncomment the `delete this.options;` line, then even the `options`
> > > property that will be gone.
>
> > > I took your code and put it (sans alerts) in a page that created 20
> > > TestClass objects every 250ms and then threw them away. Using Chrome's
> > > excellent about:memory page, I was able to see that the memory does
> > > (eventually) get reclaimed by Chrome, Firefox, and Opera on Linux, IE6
> > > on Windows 2000, and IE8 on Windows 7. They were wildly different
> > > about when they did it. Chrome started at using 12k for the page,
> > > which shot up to 60k almost immediately (certainly on the first 40-60
> > > TestClass instances), and then allowed memory use to go up to 85-95k
> > > before reclaiming back down to 62-64k and letting it climb again.
> > > Firefox 3.6 started at about 50k and allowed use to creep up to 250k
> > > before reclaiming back down to ~70k again (rinse, repeat). Opera was
> > > the most aggressive about reclaiming the memory, starting at 38k,
> > > jumping almost immediately to 57k and then staying there, almost
> > > completely steady. On Windows, IE8 started at about 33k and allowed
> > > that to grow to about 57-59k before reclaiming back down to 33k again
> > > and allowing it to grow. (Wow is IE slow.) Even IE6 on Windows 2000
> > > (measured via Task Manager rather than Chrome) reclaimed the memory
> > > (occillating between 7k and 25k).
>
> > > Then I modified the code to retain the TestClass instances, to test
> > > whether the instances were somehow keeping the elements in memory. In
> > > all five cases (Chrome, Firefox, and Opera under Linux, IE8 under
> > > Windows, and IE6 under Windows), they weren't. The memory use was
> > > virtually identical to the first test, which shows that by the time
> > > you've done your "destroy", the instances *don't* retain any memory
> > > references that prevent cleanup. (The instances themselves will be
> > > very small.)
>
> > > BTW, you don't need to explicitly null-out the array elements before
> > > releasing the array. I've heard people say you do, but it doesn't make
> > > any sense from a JavaScript specification perspective (not that that
> > > matters, particularly not when you're talking about IE) but this
> > > seemed like a good opportunity to test it for myself. Commenting out
> > > the loop in `destroy` that nulls out the elements made no difference,
> > > not even on IE6. I think it's a myth.
>
> > > So that means your `destroy` can consist entirely of this:
>
> > >     destroy: function() {
> > >         delete this.options;
> > >     }
>
> > > ...since you're keeping everything on the `options` object.
>
> > > Here are the test files:http://pastie.org/1240577-thebasic counter 
> > > testhttp://pastie.org/1240579-keepthe instances 
> > > testhttp://pastie.org/1240582-don'tnull out array entries 
> > > testhttp://pastie.org/1240613-usingthe one-liner `destroy` above
>
> > > HTH,
> > > --
> > > T.J. Crowder
> > > Independent Software Engineer
> > > tj / crowder software / com
> > > www / crowder software / com
>
> > > On Oct 22, 10:52 am, jose maria Cano <josemaria.c...@gmail.com> wrote:
>
> > > > Hi guys,
> > > > I have a big problem in my application, when I create a global class
> > > > object is impossible for me to release the memory and I'm having
> > > > memory leaks.
>
> > > > I've made a small class as example.
>
> > > > var TestClass = Class.create({
>
> > > >     initialize: function() {
> > > >         this.options = {
> > > >             vari: '',
> > > >             array: '',
> > > >             testDiv: ''
> > > >         };
> > > >         this.addElement();
> > > >     },
> > > >     addElement: function(element) {
> > > >         var a = 0;
> > > >         var arrayDivs = [];
> > > >         alert('before create element');
> > > >         for (var i = 0; i < 2000; i++) {
> > > >             var div = new Element('div');
> > > >             div.innerHTML = 'test' + i;
> > > >             arrayDivs.push(div);
> > > >         }
> > > >         alert('after create element');
> > > >         this.options.vari = 'pepe';
> > > >         this.options.array = arrayDivs;
> > > >         this.options.testDiv = new Element('div', { 'id':
> > > > 'testdivPepe' });
> > > >         this.destroy();
> > > >     },
> > > >     destroy: function() {
> > > >         alert('before destroy');
> > > >         for (var i = 0; i < this.options.array.length; i++) {
> > > >             this.options.array[i] = null;
> > > >             //this.options.array.pop();
> > > >         }
> > > >         //this.options.array.splice(0, this.options.array.length);
> > > >        
>
> ...
>
> leer más »

-- 
You received this message because you are subscribed to the Google Groups 
"Prototype & script.aculo.us" group.
To post to this group, send email to prototype-scriptacul...@googlegroups.com.
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en.

Reply via email to