views:

355

answers:

7

I have a few scripts that use jQuery, and I think I have a memory leak in one of them.

How one could profile and find what parts of the scripts that I have are using the most memory/CPU?

Thanks

A: 

Firebug or Google's Page Speed for Firefox have profiling tools.

Eimantas
+4  A: 

Use Firebug. To quote from http://getfirebug.com/js.html:

To use the profiler, just go to the Console tab and click the "Profile" button. Then use your app for a bit or reload the page and then click the "Profile" button again. You'll then see a detailed report that shows what functions were called and how much time each one took.

msanders
+2  A: 

I would suggest taking a look at the profiler in Firebug, and the Drip plugin for IE to help look for memory leaks.

Also, just keep in mind that most javascript memory leaks come from circular references between DOM objects and javascript objects not being broken when the DOM object is unloaded. To prevent that, I would suggest avoiding creating references to javascript objects in DOM object properties (ie, avoid something like document.getElementById('foo').bar = myObject;). If you must create these circular references, be sure to break them yourself in a function that runs when the page unloads, or when removing the DOM objects prior to unload.

pkaeding
A: 

Another simple way to test a specific piece of code is to add a timer around it.

var testStart = new Date();

// code to be tested here

$('#jstest').html("selected function: "+ (new Date() - testStart) + " milliseconds");

Where jstest is a span element somewhere visible on your page.

macca1
A: 

Google Chrome also has profile options

Vestel
+5  A: 

Regarding memory consumption

Memory leaks in JavaScript are usually ignored except when they turn into browser memory leaks (that is, even after the user navigates away from the page, the memory continues allocated and there's no way to free it). The reason for this is that while your web application may have some memory leaks, users will go from one page into another so the leaks are minimized. However they may not restart the browser, so browser memory leaks may be serious. Some JavaScript code is known to cause memory leaks on certain browsers, being Internet Explorer probably the worst in this area. For it you may find Microsoft JavaScript Memory Leak Detector to be very useful.

Regarding times

IE, Chrome and Safari have built in profilers in the web development tools that ship with the browser. For Firefox you may use Firebug. Also useful may be, since you're using jQuery which means your profiling report will be filled with anonymous functions and alike, making it quite unreadable, John Resig's jQuery profiling plugin, which will give you a clearer output on the matter.

Miguel Ventura
Thanks a lot, I will try the memory leak detector for IE.P.S., the link in Ajaxian is no longer working, here's the working link: http://blogs.msdn.com/gpde/pages/javascript-memory-leak-detector_v2.aspx
Eli
A: 

This post by John Resig (jQuery) may be helpful for detecting memory leaks in IE:

http://ejohn.org/blog/deep-tracing-of-internet-explorer/

David Murdoch