зеркало из https://github.com/mozilla/gecko-dev.git
Bug 807181 - Add a memory reporter for unique set size (USS), which we'll call "resident-unique". r=njn
Patch originally by Vivien Nicolas in bug 802110.
This commit is contained in:
Родитель
c19ba457b5
Коммит
af2be86e6e
|
@ -514,10 +514,55 @@ MapsReporter::ParseMapBody(
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static nsresult GetUSS(int64_t *n)
|
||||||
|
{
|
||||||
|
// You might be tempted to calculate USS by subtracting the "shared" value
|
||||||
|
// from the "resident" value in /proc/<pid>/statm. But at least on Linux,
|
||||||
|
// statm's "shared" value actually counts pages backed by files, which has
|
||||||
|
// little to do with whether the pages are actually shared. smaps on the
|
||||||
|
// other hand appears to give us the correct information.
|
||||||
|
//
|
||||||
|
// We could calculate this data during the smaps multi-reporter, but the
|
||||||
|
// overhead of the smaps reporter is considerable (we don't even run the
|
||||||
|
// smaps reporter in normal about:memory operation). Hopefully this
|
||||||
|
// implementation is fast enough not to matter.
|
||||||
|
|
||||||
|
*n = 0;
|
||||||
|
|
||||||
|
FILE *f = fopen("/proc/self/smaps", "r");
|
||||||
|
NS_ENSURE_STATE(f);
|
||||||
|
|
||||||
|
int64_t total = 0;
|
||||||
|
char line[256];
|
||||||
|
while(fgets(line, sizeof(line), f)) {
|
||||||
|
long long val = 0;
|
||||||
|
if(sscanf(line, "Private_Dirty: %lld kB", &val) == 1 ||
|
||||||
|
sscanf(line, "Private_Clean: %lld kB", &val) == 1) {
|
||||||
|
total += val * 1024; // convert from kB to bytes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*n = total;
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_FALLIBLE_MEMORY_REPORTER_IMPLEMENT(USS,
|
||||||
|
"resident-unique",
|
||||||
|
KIND_OTHER,
|
||||||
|
UNITS_BYTES,
|
||||||
|
GetUSS,
|
||||||
|
"Memory mapped by the process that is present in physical memory and not "
|
||||||
|
"shared with any other processes. This is also known as the process's "
|
||||||
|
"unique set size (USS). This is the amount of RAM we'd expect to be freed "
|
||||||
|
"if we closed this process.")
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIMemoryMultiReporter> reporter = new MapsReporter();
|
nsCOMPtr<nsIMemoryMultiReporter> reporter = new MapsReporter();
|
||||||
NS_RegisterMemoryMultiReporter(reporter);
|
NS_RegisterMemoryMultiReporter(reporter);
|
||||||
|
|
||||||
|
NS_RegisterMemoryReporter(new NS_MEMORY_REPORTER_NAME(USS));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace MapsMemoryReporter
|
} // namespace MapsMemoryReporter
|
||||||
|
|
Загрузка…
Ссылка в новой задаче