mozilla

Compare Revisions

Common causes of memory leaks in extensions

Change Revisions

Revision 49897:

Revision 49897 by Nmaier on

Revision 49898:

Revision 49898 by Nmaier on

Title:
Common causes of memory leaks in extensions
Common causes of memory leaks in extensions
Slug:
Extensions/Common_causes_of_memory_leaks_in_extensions
Extensions/Common_causes_of_memory_leaks_in_extensions
Tags:
Extensions, Add-ons, memory
Extensions, Add-ons, memory
Content:

Revision 49897
Revision 49898
tt59    </p>
60    <h3>
61      Be careful with setInterval/setTimeout
62    </h3>
63    <p>
64      Using&nbsp;<code>setInterval</code>/<code>setTimeout</code>
 > can be problematic, too, when it comes to zombie compartments. C
 >onsider the following example code that could be part of your <co
 >de>browser.xul</code> overlay:
65    </p>
66    <pre class="brush: js">
67gBrowser.addEventListener("DOMContentLoaded", function(evt) {
68  var contentDoc = evt.originalTarget;
69  var i = 0;
70  
71  // Refresh the title once each second
72  setInterval(function() {
73    contentDoc.title = ++i;
74  }, 1000);
75}, false);
76</pre>
77    <p>
78      One would normally expect that the interval (or timer) woul
 >d be destroyed as soon as the document unloads, same as event lis
 >teners are automatically destroyed. However, while this is still 
 >true, the <code>setInterval</code> in the example originates from
 > the outer chrome window (<code>browser.xul</code>) and not from 
 >the content window. Hence the interval will only be destroyed whe
 >n the outer window is unloaded, i.e. when the user closes the who
 >le browser window, but not when the content window unloads, i.e. 
 >when the user closes the tab. The interval function in the exampl
 >e would still hold a reference to <code>contentDoc</code>, theref
 >ore leaking the content document and the associated window and co
 >mpartment.
79    </p>
80    <p>
81      If your add-on makes use of long-lived timeouts or uses <co
 >de>setInterval</code>, you need to take special care to ensure yo
 >ur code won't accidentally leak content windows. Therefore, your 
 >add-on should clean up such intervals and timeouts when the corre
 >sponding content document is unloaded, by adding an <code>unload<
 >/code> event listener or by similar means. Another solution would
 > be to use the <code>setInterval</code>/<code>setTimeout</code> i
 >nstances content windows provide, but there is a big drawback wit
 >h this idea: If the user disables Javascript globally or locally 
 >(e.g. NoScript), then using the content window functions won't wo
 >rk.

Back to History