I am making an AJAX request for XML. I am doing this every second. I notice that my memory usage grows into the hundreds of megabytes. As you might imagine, the customer is not happy with this. After doing some reading in various places, I suspect that function closures are causing my headache. I am looking for any verification that can be had as well as any help for how to fix it.
function PageManager () {
var self = this;
self.timeoutHandler = function () {
$.ajax ({
url: 'URLtoXML',
type: 'post',
cache: false,
context: self,
success: function (data) {
var slf = this;
var xmlDoc = $($.parseXML (data));
xmlDoc.find ("tag_label").each (function () {
self.val = parseInt ($.trim ($(this).text ()));
}
setTimeout (slf.timeoutHandler, 750);
}
});
}
}
var pm = new PageManager ();
pm.timeoutHandler ();
EDIT I have incorporated some people's ideas and a little of the success handler internals. I see a smaller growth rate, but not by much.
To avoid that any newly created function (context) is closing over its parent scope here, you would just need to get rid of the anonymous function in setTimeout
there. So
setTimeout(self.timeoutHandler, 750);
However, even if that closure would clouse over the parent(s) contexts, any half decent garbage collector (like any modern browser have) will notice it and free the memory after the method has fired. The very important thing you didn't mention is on which browser you noticed the behavior. The Firefox garbage collector for instance, works .. pretty unpretictable (at least to me). It'll allow for more and more memory to get used and then on some point, it will release a huge chunk again.
To see what is going on, use Firefox and have a look into about:memory
while your script is running.
There you will see where the memory goes. I would not be worried if the memory usage increases for a while. Look at it, if that is all of your code, the memory should get freed sooner or later.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With