Closed
Bug 1326096
Opened 8 years ago
Closed 8 years ago
Add memory reporter for external strings
Categories
(Core :: DOM: Core & HTML, defect)
Tracking
()
RESOLVED
FIXED
mozilla53
Tracking | Status | |
---|---|---|
firefox53 | --- | fixed |
People
(Reporter: smaug, Assigned: bzbarsky)
References
Details
Attachments
(5 files)
281 bytes,
text/html
|
Details | |
369 bytes,
text/html
|
Details | |
4.15 KB,
patch
|
Waldo
:
review+
|
Details | Diff | Splinter Review |
1.64 KB,
patch
|
Waldo
:
review+
|
Details | Diff | Splinter Review |
4.65 KB,
patch
|
froydnj
:
review+
|
Details | Diff | Splinter Review |
![]() |
Assignee | |
Comment 1•8 years ago
|
||
This testcase confuses me. It should allocate 2GB or so of external strings. And stepping through in a debugger, I see us doing just that: mallocing a bunch of stringbuffers, handing each one over to the JS engine as an external string. The confusing part is that when all is done about:memory does _not_ show 2GB of heap-unclassified, and if I ask the OS how much memory the process is using it's nowhere close to 2GB. This is very confusing to me....
njn, any idea what's going on here?
Flags: needinfo?(n.nethercote)
![]() |
||
Comment 2•8 years ago
|
||
Off the top of my head, I don't know what's happening. But the OS should be correct. I see 400 MiB of arrays (8 bytes per elements, which seems reasonable) but no strings. You see a bunch of strings being allocated -- do you see 5e7 of them?
I can take a closer look when I get back from PTO on Jan 9 if it's still a mystery then.
Flags: needinfo?(n.nethercote)
![]() |
Assignee | |
Comment 3•8 years ago
|
||
> You see a bunch of strings being allocated -- do you see 5e7 of them?
Oh, hmm. Good point! I bet what's going on here is that once we ion-compile we end up loop-hoisting the innerHTML get. Let me check that hypothesis.
![]() |
Assignee | |
Comment 4•8 years ago
|
||
I'm seeing a nice 85% or so heap-unclassified with this testcase.
![]() |
||
Comment 5•8 years ago
|
||
I think that rather than overloading the finalizer function we pass in for external strings, or providing a separate function (bloating JS strings for little win), the best thing is to register some sort of callback for the JS engine memory reporting bits for when external strings are encountered during memory reporting. Not sure whether we can attribute those external strings to the web page that caused them, though even just being able to say "hey, there's a pile of external strings here!" might be a useful thing to know...
![]() |
Assignee | |
Comment 6•8 years ago
|
||
Ok, so with a bit of plumbing, that testcase now gives me:
2,850.79 MB (100.0%) -- explicit
├──2,688.96 MB (94.32%) -- js-non-window
│ ├──2,680.50 MB (94.03%) -- zones
│ │ ├──2,672.75 MB (93.75%) -- zone(0x118ca7000)
│ │ │ ├──2,670.29 MB (93.67%) -- strings
│ │ │ │ ├──2,670.29 MB (93.67%) -- string(length=61, copies=9999999, "<div x="y">/n <span>Please look at about:memory</span>/n</di")
which is better than nothing, but still doesn't pin the strings on a particular website, unfortunately. I think that's a general problem with the way the JS engine reports string memory, though...
![]() |
Assignee | |
Comment 7•8 years ago
|
||
Attachment #8822293 -
Flags: review?(jwalden+bmo)
![]() |
Assignee | |
Updated•8 years ago
|
Assignee: nobody → bzbarsky
Status: NEW → ASSIGNED
![]() |
Assignee | |
Comment 8•8 years ago
|
||
Attachment #8822294 -
Flags: review?(jwalden+bmo)
![]() |
Assignee | |
Comment 9•8 years ago
|
||
Attachment #8822295 -
Flags: review?(nfroyd)
Comment 10•8 years ago
|
||
Comment on attachment 8822293 [details] [diff] [review]
part 1. Add a way to set an external string memory runtime callback
Review of attachment 8822293 [details] [diff] [review]:
-----------------------------------------------------------------
::: js/src/jsapi.h
@@ +734,5 @@
> + * JSStringFinalizer passed to JS_NewExternalString for this string.
> + */
> +typedef size_t
> +(* JSExternalStringSizeofCallback)(JSString* str,
> + mozilla::MallocSizeOf mallocSizeOf);
It's inconsistent with the surrounding code, but whatever, we prefer it now -- use a C++11-style typedef:
using JSExternalStringSizeofCallback =
size_t (*)(JSString* str, mozilla::MallocSizeOf mallocSizeOf);
::: js/src/vm/Runtime.h
@@ +843,5 @@
>
> /* Call this to get the name of a compartment. */
> JSCompartmentNameCallback compartmentNameCallback;
>
> + /* Callback for doing memory reporting on external strings */
Period at end.
Attachment #8822293 -
Flags: review?(jwalden+bmo) → review+
Comment 11•8 years ago
|
||
Comment on attachment 8822294 [details] [diff] [review]
part 2. If there is an external string memory runtime callback, call it from memory reporting code
Review of attachment 8822294 [details] [diff] [review]:
-----------------------------------------------------------------
::: js/src/vm/String.cpp
@@ +56,5 @@
> + // JSExternalString: Ask the embedding to tell us what's going on. If it
> + // doesn't want to say, don't count, the chars could be stored anywhere.
> + if (isExternal()) {
> + JSRuntime* rt = runtimeFromMainThread();
> + if (rt->externalStringSizeofCallback)
I'd do
if (auto* cb = runtimeFromMainThread()->externalStringSizeofCallback)
return cb(this, mallocSizeOf);
which also happens to make clear that the callback is a function pointer and not a member function that might get passed the runtime.
Attachment #8822294 -
Flags: review?(jwalden+bmo) → review+
![]() |
Assignee | |
Comment 12•8 years ago
|
||
Addressed those comments.
![]() |
||
Comment 13•8 years ago
|
||
Comment on attachment 8822295 [details] [diff] [review]
part 3. Pass a useful external string memory reporter to SpiderMonkey from Gecko code
Review of attachment 8822295 [details] [diff] [review]:
-----------------------------------------------------------------
Thank you!
Attachment #8822295 -
Flags: review?(nfroyd) → review+
Comment 14•8 years ago
|
||
Pushed by bzbarsky@mozilla.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/88b94a2497dc
part 1. Add a way to set an external string memory runtime callback. r=waldo
https://hg.mozilla.org/integration/mozilla-inbound/rev/52d6c09777ee
part 2. If there is an external string memory runtime callback, call it from memory reporting code. r=waldo
https://hg.mozilla.org/integration/mozilla-inbound/rev/d3a2ffd6f792
part 3. Pass a useful external string memory reporter to SpiderMonkey from Gecko code. r=froydnj
Comment 15•8 years ago
|
||
Pushed by bzbarsky@mozilla.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/defd98672958
followup. Suppress the false-positive GC analysis failure due to us doing an indirect call that the static analysis doesn't understand. r=sfink
Comment 16•8 years ago
|
||
Pushed by bzbarsky@mozilla.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/9c2b070d0054
another followup: fix build bustage on CLOSED TREE.
Comment 17•8 years ago
|
||
Pushed by bzbarsky@mozilla.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/72e5976fb87a
yet another followup. Silence the opinionated spidermonkey include style checker on CLOSED TREE
Comment 18•8 years ago
|
||
Backout by bzbarsky@mozilla.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/9fc7373573e9
Back out bits that should not have landed for bug 1326096 on CLOSED TREE.
Comment 19•8 years ago
|
||
bugherder |
Status: ASSIGNED → RESOLVED
Closed: 8 years ago
status-firefox53:
--- → fixed
Resolution: --- → FIXED
Target Milestone: --- → mozilla53
Updated•6 years ago
|
Component: DOM → DOM: Core & HTML
You need to log in
before you can comment on or make changes to this bug.
Description
•