Closed Bug 651531 Opened 13 years ago Closed 13 years ago

A single page-worker.Page can only load ~2630 pages before NS_ERROR_OUT_OF_MEMORY from evalInSandbox

Categories

(Add-on SDK Graveyard :: General, defect, P2)

x86
macOS
defect

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: jwatt, Assigned: ochameau)

References

()

Details

(Keywords: memory-leak)

Attachments

(2 files)

Spinning this off from bug 642306.

It doesn't seem to be possible to reuse a single page-worker.Page (setting its 'contentURL' property to about:blank?<incremented>) more than ~2630 times before setting the property causes the following console output, preventing the Page instance from being used again:

error: An exception occurred.
Traceback (most recent call last):
  File "resource://jid0-r5rj13fz1ughflxgwp9cwfttvfe-api-utils-lib/observer-service.js", line 174, in null
    this.callback(subject, data);
  File "resource://jid0-r5rj13fz1ughflxgwp9cwfttvfe-api-utils-lib/content/symbiont.js", line 191, in _onStart
    this._onInit();
  File "resource://jid0-r5rj13fz1ughflxgwp9cwfttvfe-api-utils-lib/content/worker.js", line 340, in Worker
    WorkerGlobalScope(this); // will set this._port pointing to the private API
  File "resource://jid0-r5rj13fz1ughflxgwp9cwfttvfe-api-utils-lib/traits.js", line 142, in Trait
    return self.constructor.apply(self, arguments) || self._public;
  File "resource://jid0-r5rj13fz1ughflxgwp9cwfttvfe-api-utils-lib/content/worker.js", line 179, in WorkerGlobalScope
    Cu.evalInSandbox(es5code.contents, sandbox, "1.8", es5code.filename);
[Exception... "Component returned failure code: 0x8007000e (NS_ERROR_OUT_OF_MEMORY) [nsIXPCComponents_Utils.evalInSandbox]"  nsresult: "0x8007000e (NS_ERROR_OUT_OF_MEMORY)"  location: "JS frame :: resource://jid0-r5rj13fz1ughflxgwp9cwfttvfe-api-utils-lib/securable-module.js -> resource://jid0-r5rj13fz1ughflxgwp9cwfttvfe-api-utils-lib/content/worker.js :: WorkerGlobalScope :: line 179"  data: no]

There's a test add-on at http://hg.jwatt.org/page-worker-leak/ - click on the red add-on icon to start/stop loading about:blank into the Page singleton. Hover over the red icon to see the current load count.

I'm using an early 2011 MacBook Pro with 8 GB of RAM, and I have tons of RAM free when the NS_ERROR_OUT_OF_MEMORY exception is thrown.
Priority: -- → P2
Target Milestone: --- → 1.0
I think I finally found why Page worker was leaking when we reuse one existing instance. I think some stuff was leaking like in Widget in bug 652530.
Then we are leaking various objects from Worker.js as we do not call Worker._workerCleanup. It should be called on document unload but may be it's too late or do not happens on location change ... But if we call it manually, this leaks appears to be fixed.

# Without bug 652530 patch, nor following patch:
Memory used before/after changing worker location 500 times:
   before: 39896184
   after : 43605476
Assignee: nobody → poirot.alex
Attached patch Fix this leak.Splinter Review
Simply call Worker._workerCleanup from page worker code before loading a new content script in the new document.

# With 652530 patch, and this additional fix:
Memory used before/after changing worker location 500 times:
   before: 39963652
   after : 42648984

Jonathan: Can you confirm that this leak is finally fixed by applying both patches ?
Attachment #531745 - Flags: review?(rFobic)
Woo! Confirmed! Quick test got to over 100,000 loads in the same worker, with no noticeable increase in Firefox memory, and no NS_ERROR_OUT_OF_MEMORY exception. :)
Comment on attachment 531745 [details] [diff] [review]
Fix this leak.

Review of attachment 531745 [details] [diff] [review]:
-----------------------------------------------------------------

Thanks Alex, looks good!
Attachment #531745 - Flags: review?(rFobic) → review+
https://github.com/mozilla/addon-sdk/commit/178ff5b9a7aa474828f2f7b8439e43c204becfd3
Status: NEW → RESOLVED
Closed: 13 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: