Bug 671159 - Mark entries in about:memory that come from multiple same-named memory reporters. r=jlebar.

This commit is contained in:
Nicholas Nethercote 2011-07-19 16:59:17 -07:00
parent ffb5db8d32
commit 4dfaf50493
2 changed files with 57 additions and 32 deletions

View File

@ -157,6 +157,7 @@ function update()
// _units: number; // _units: number;
// _amount: number; // _amount: number;
// _description: string; // _description: string;
// _nMerged: number; (only defined if >= 2)
// } // }
// //
// After this point we never use the original memory reporter again. // After this point we never use the original memory reporter again.
@ -182,10 +183,19 @@ function update()
reportersByProcess[process] = {}; reportersByProcess[process] = {};
} }
var reporters = reportersByProcess[process]; var reporters = reportersByProcess[process];
if (reporters[r._path]) { var reporter = reporters[r._path];
if (reporter) {
// Already an entry; must be a duplicated reporter. This can // Already an entry; must be a duplicated reporter. This can
// happen legitimately. Sum the values. // happen legitimately. Sum the values (accounting for possible kUnknown
reporters[r._path]._amount += r._amount; // amounts), and mark the reporter as a dup. We mark dups because it's
// useful to know when a reporter is duplicated; it might be worth
// investigating and splitting up to have non-duplicated names.
if (reporter._amount !== kUnknown && r._amount !== kUnknown) {
reporter._amount += r._amount;
} else if (reporter._amount === kUnknown && r._amount !== kUnknown) {
reporter._amount = r._amount;
}
reporter._nMerged = reporter._nMerged ? reporter._nMerged + 1 : 2;
} else { } else {
reporters[r._path] = r; reporters[r._path] = r;
} }
@ -283,13 +293,14 @@ function genProcessText(aProcess, aReporters)
* *
* @return The built tree. The tree nodes have this structure: * @return The built tree. The tree nodes have this structure:
* interface Node { * interface Node {
* _name: string; * _name: string;
* _kind: number; * _kind: number;
* _amount: number; (non-negative or 'kUnknown') * _amount: number; (non-negative or 'kUnknown')
* _description: string; * _description: string;
* _kids: [Node]; * _kids: [Node];
* _hasReporter: boolean; (only defined if 'true') * _hasReporter: boolean; (only defined if 'true')
* _hasProblem: boolean; (only defined if 'true') * _hasProblem: boolean; (only defined if 'true')
* _nMerged: number; (only defined if >= 2)
* } * }
*/ */
function buildTree() function buildTree()
@ -307,9 +318,10 @@ function genProcessText(aProcess, aReporters)
return undefined; return undefined;
} }
// We want to process all reporters that begin with 'treeName'. // We want to process all reporters that begin with 'treeName'. First we
// First we build the tree but only filling in '_name', '_kind', '_kids' // build the tree but only filling in '_name', '_kind', '_units', '_kids',
// and maybe '._hasReporter'. This is done top-down from the reporters. // maybe '_hasReporter' and maybe '_nMerged'. This is done top-down from
// the reporters.
var t = { var t = {
_name: "falseRoot", _name: "falseRoot",
_kind: KIND_OTHER, _kind: KIND_OTHER,
@ -337,6 +349,9 @@ function genProcessText(aProcess, aReporters)
} }
u._kind = r._kind; u._kind = r._kind;
u._hasReporter = true; u._hasReporter = true;
if (r._nMerged) {
u._nMerged = r._nMerged;
}
} }
} }
// Using falseRoot makes the above code simpler. Now discard it, leaving // Using falseRoot makes the above code simpler. Now discard it, leaving
@ -695,19 +710,25 @@ function prepDesc(aStr)
return escapeQuotes(flipBackslashes(aStr)); return escapeQuotes(flipBackslashes(aStr));
} }
function genMrNameText(aKind, aDesc, aName, aHasProblem) function genMrNameText(aKind, aDesc, aName, aHasProblem, aNMerged)
{ {
const problemDesc =
"Warning: this memory reporter was unable to compute a useful value. " +
"The reported value is the sum of all entries below '" + aName + "', " +
"which is probably less than the true value.";
var text = "-- <span class='mrName hasDesc' title='" + var text = "-- <span class='mrName hasDesc' title='" +
kindToString(aKind) + prepDesc(aDesc) + kindToString(aKind) + prepDesc(aDesc) +
"'>" + prepName(aName) + "</span>"; "'>" + prepName(aName) + "</span>";
text += aHasProblem if (aHasProblem) {
? " <span class='mrStar' title=\"" + problemDesc + "\">[*]</span>\n" const problemDesc =
: "\n"; "Warning: this memory reporter was unable to compute a useful value. " +
return text; "The reported value is the sum of all entries below '" + aName + "', " +
"which is probably less than the true value.";
text += " <span class='mrStar' title=\"" + problemDesc + "\">[*]</span>";
}
if (aNMerged) {
const dupDesc = "This value is the sum of " + aNMerged +
" memory reporters that all have the same path.";
text += " <span class='mrStar' title=\"" + dupDesc + "\">[" +
aNMerged + "]</span>";
}
return text + '\n';
} }
/** /**
@ -791,7 +812,7 @@ function genTreeText(aT)
var text = indent + genMrValueText(tMemoryUsedStr) + " " + perc + var text = indent + genMrValueText(tMemoryUsedStr) + " " + perc +
genMrNameText(aT._kind, aT._description, aT._name, genMrNameText(aT._kind, aT._description, aT._name,
aT._hasProblem); aT._hasProblem, aT._nMerged);
for (var i = 0; i < aT._kids.length; i++) { for (var i = 0; i < aT._kids.length; i++) {
// 3 is the standard depth, the callee adjusts it if necessary. // 3 is the standard depth, the callee adjusts it if necessary.
@ -848,7 +869,8 @@ function genOtherText(aReporters)
_units: r._units, _units: r._units,
_amount: hasProblem ? 0 : r._amount, _amount: hasProblem ? 0 : r._amount,
_description: r._description, _description: r._description,
_hasProblem: hasProblem _hasProblem: hasProblem,
_nMerged: r._nMerged
}; };
rArray.push(elem); rArray.push(elem);
var thisAmountLength = formatReporterAmount(elem).length; var thisAmountLength = formatReporterAmount(elem).length;
@ -866,7 +888,7 @@ function genOtherText(aReporters)
text += genMrValueText( text += genMrValueText(
pad(formatReporterAmount(elem), maxAmountLength, ' ')) + " "; pad(formatReporterAmount(elem), maxAmountLength, ' ')) + " ";
text += genMrNameText(elem._kind, elem._description, elem._path, text += genMrNameText(elem._kind, elem._description, elem._path,
elem._hasProblem); elem._hasProblem, elem._nMerged);
} }
// Nb: the newlines give nice spacing if we cut+paste into a text buffer. // Nb: the newlines give nice spacing if we cut+paste into a text buffer.

View File

@ -126,7 +126,8 @@
var fakeReporters2 = [ var fakeReporters2 = [
f("2nd", "heap-allocated", OTHER, 1000 * MB), f("2nd", "heap-allocated", OTHER, 1000 * MB),
f("2nd", "heap-unallocated",OTHER, 100 * MB), f("2nd", "heap-unallocated",OTHER, 100 * MB),
f("2nd", "explicit/a/b/c", HEAP, 498 * MB), f("2nd", "explicit/a/b/c", HEAP, 497 * MB),
f("2nd", "explicit/a/b/c", HEAP, 1 * MB), // dup: merge
f("2nd", "explicit/a/b/c", HEAP, 1 * MB), // dup: merge f("2nd", "explicit/a/b/c", HEAP, 1 * MB), // dup: merge
f("2nd", "explicit/flip\\the\\backslashes", f("2nd", "explicit/flip\\the\\backslashes",
HEAP, 200 * MB), HEAP, 200 * MB),
@ -138,12 +139,14 @@
f("2nd", "other1", OTHER, 111 * MB), f("2nd", "other1", OTHER, 111 * MB),
// kUnknown should be handled gracefully for "heap-allocated", non-leaf // kUnknown should be handled gracefully for "heap-allocated", non-leaf
// reporters, leaf-reporters, and "other" reporters. // reporters, leaf-reporters, "other" reporters, and duplicated reporters.
f("3rd", "heap-allocated", OTHER, kUnknown), f("3rd", "heap-allocated", OTHER, kUnknown),
f("3rd", "explicit/a", HEAP, kUnknown), f("3rd", "explicit/a", HEAP, kUnknown),
f("3rd", "explicit/a/b", HEAP, 333 * MB), f("3rd", "explicit/a/b", HEAP, 333 * MB),
f("3rd", "explicit/a/c", HEAP, 444 * MB), f("3rd", "explicit/a/c", HEAP, 444 * MB),
f("3rd", "explicit/a/c", HEAP, kUnknown), // dup: merge
f("3rd", "explicit/a/d", HEAP, kUnknown), f("3rd", "explicit/a/d", HEAP, kUnknown),
f("3rd", "explicit/a/d", HEAP, kUnknown), // dup: merge
f("3rd", "explicit/b", NONHEAP, kUnknown), f("3rd", "explicit/b", NONHEAP, kUnknown),
f("3rd", "other1", OTHER, kUnknown) f("3rd", "other1", OTHER, kUnknown)
]; ];
@ -174,13 +177,13 @@ Explicit Allocations\n\
├──222.00 MB (35.60%) -- a\n\ ├──222.00 MB (35.60%) -- a\n\
├──100.00 MB (16.04%) -- c\n\ ├──100.00 MB (16.04%) -- c\n\
│ ├───77.00 MB (12.35%) -- other\n\ │ ├───77.00 MB (12.35%) -- other\n\
│ └───23.00 MB (03.69%) -- d\n\ │ └───23.00 MB (03.69%) -- d [2]\n\
├───23.00 MB (03.69%) -- cc\n\ ├───23.00 MB (03.69%) -- cc [2]\n\
├───20.00 MB (03.21%) -- f\n\ ├───20.00 MB (03.21%) -- f\n\
│ └──20.00 MB (03.21%) -- g\n\ │ └──20.00 MB (03.21%) -- g\n\
│ └──20.00 MB (03.21%) -- h\n\ │ └──20.00 MB (03.21%) -- h\n\
│ └──20.00 MB (03.21%) -- i\n\ │ └──20.00 MB (03.21%) -- i\n\
├───15.00 MB (02.41%) -- g\n\ ├───15.00 MB (02.41%) -- g [2]\n\
│ ├───6.00 MB (00.96%) -- a\n\ │ ├───6.00 MB (00.96%) -- a\n\
│ ├───5.00 MB (00.80%) -- b\n\ │ ├───5.00 MB (00.80%) -- b\n\
│ └───4.00 MB (00.64%) -- other\n\ │ └───4.00 MB (00.64%) -- other\n\
@ -202,7 +205,7 @@ Explicit Allocations\n\
1,000.00 MB (100.0%) -- explicit\n\ 1,000.00 MB (100.0%) -- explicit\n\
├────499.00 MB (49.90%) -- a\n\ ├────499.00 MB (49.90%) -- a\n\
│ └──499.00 MB (49.90%) -- b\n\ │ └──499.00 MB (49.90%) -- b\n\
│ └──499.00 MB (49.90%) -- c\n\ │ └──499.00 MB (49.90%) -- c [3]\n\
├────200.00 MB (20.00%) -- flip/the/backslashes\n\ ├────200.00 MB (20.00%) -- flip/the/backslashes\n\
├────200.00 MB (20.00%) -- compartment(this-will-be-truncated-in-non-verbose-mo...)\n\ ├────200.00 MB (20.00%) -- compartment(this-will-be-truncated-in-non-verbose-mo...)\n\
└────101.00 MB (10.10%) -- heap-unclassified\n\ └────101.00 MB (10.10%) -- heap-unclassified\n\
@ -218,7 +221,7 @@ Other Measurements\n\
Explicit Allocations\n\ Explicit Allocations\n\
777.00 MB (100.0%) -- explicit\n\ 777.00 MB (100.0%) -- explicit\n\
├──777.00 MB (100.0%) -- a [*]\n\ ├──777.00 MB (100.0%) -- a [*]\n\
│ ├──444.00 MB (57.14%) -- c\n\ │ ├──444.00 MB (57.14%) -- c [2]\n\
│ ├──333.00 MB (42.86%) -- b\n\ │ ├──333.00 MB (42.86%) -- b\n\
│ └────0.00 MB (00.00%) -- (1 omitted)\n\ │ └────0.00 MB (00.00%) -- (1 omitted)\n\
└────0.00 MB (00.00%) -- (2 omitted)\n\ └────0.00 MB (00.00%) -- (2 omitted)\n\
@ -244,13 +247,13 @@ Explicit Allocations\n\
├──232,783,872 B (35.60%) -- a\n\ ├──232,783,872 B (35.60%) -- a\n\
├──104,857,600 B (16.04%) -- c\n\ ├──104,857,600 B (16.04%) -- c\n\
│ ├───80,740,352 B (12.35%) -- other\n\ │ ├───80,740,352 B (12.35%) -- other\n\
│ └───24,117,248 B (03.69%) -- d\n\ │ └───24,117,248 B (03.69%) -- d [2]\n\
├───24,117,248 B (03.69%) -- cc\n\ ├───24,117,248 B (03.69%) -- cc [2]\n\
├───20,971,520 B (03.21%) -- f\n\ ├───20,971,520 B (03.21%) -- f\n\
│ └──20,971,520 B (03.21%) -- g\n\ │ └──20,971,520 B (03.21%) -- g\n\
│ └──20,971,520 B (03.21%) -- h\n\ │ └──20,971,520 B (03.21%) -- h\n\
│ └──20,971,520 B (03.21%) -- i\n\ │ └──20,971,520 B (03.21%) -- i\n\
├───15,728,640 B (02.41%) -- g\n\ ├───15,728,640 B (02.41%) -- g [2]\n\
│ ├───6,291,456 B (00.96%) -- a\n\ │ ├───6,291,456 B (00.96%) -- a\n\
│ ├───5,242,880 B (00.80%) -- b\n\ │ ├───5,242,880 B (00.80%) -- b\n\
│ └───4,194,304 B (00.64%) -- other\n\ │ └───4,194,304 B (00.64%) -- other\n\
@ -273,7 +276,7 @@ Explicit Allocations\n\
1,048,576,000 B (100.0%) -- explicit\n\ 1,048,576,000 B (100.0%) -- explicit\n\
├────523,239,424 B (49.90%) -- a\n\ ├────523,239,424 B (49.90%) -- a\n\
│ └──523,239,424 B (49.90%) -- b\n\ │ └──523,239,424 B (49.90%) -- b\n\
│ └──523,239,424 B (49.90%) -- c\n\ │ └──523,239,424 B (49.90%) -- c [3]\n\
├────209,715,200 B (20.00%) -- flip/the/backslashes\n\ ├────209,715,200 B (20.00%) -- flip/the/backslashes\n\
├────209,715,200 B (20.00%) -- compartment(this-will-be-truncated-in-non-verbose-mode-abcdefghijklmnopqrstuvwxyz)\n\ ├────209,715,200 B (20.00%) -- compartment(this-will-be-truncated-in-non-verbose-mode-abcdefghijklmnopqrstuvwxyz)\n\
└────105,906,176 B (10.10%) -- heap-unclassified\n\ └────105,906,176 B (10.10%) -- heap-unclassified\n\
@ -289,9 +292,9 @@ Other Measurements\n\
Explicit Allocations\n\ Explicit Allocations\n\
814,743,552 B (100.0%) -- explicit\n\ 814,743,552 B (100.0%) -- explicit\n\
├──814,743,552 B (100.0%) -- a [*]\n\ ├──814,743,552 B (100.0%) -- a [*]\n\
│ ├──465,567,744 B (57.14%) -- c\n\ │ ├──465,567,744 B (57.14%) -- c [2]\n\
│ ├──349,175,808 B (42.86%) -- b\n\ │ ├──349,175,808 B (42.86%) -- b\n\
│ └────────────0 B (00.00%) -- d [*]\n\ │ └────────────0 B (00.00%) -- d [*] [2]\n\
├────────────0 B (00.00%) -- b [*]\n\ ├────────────0 B (00.00%) -- b [*]\n\
└────────────0 B (00.00%) -- heap-unclassified [*]\n\ └────────────0 B (00.00%) -- heap-unclassified [*]\n\
\n\ \n\