| Index: third_party/tcmalloc/tcmalloc.cc
|
| diff --git a/third_party/tcmalloc/tcmalloc.cc b/third_party/tcmalloc/tcmalloc.cc
|
| index e3bbb819c44d556f6108845e679c1fd2ffd47f12..97cc4144b3dc5918b216aadd2cdb2eb23c0bba26 100644
|
| --- a/third_party/tcmalloc/tcmalloc.cc
|
| +++ b/third_party/tcmalloc/tcmalloc.cc
|
| @@ -367,6 +367,7 @@ size_t InvalidGetAllocatedSize(void* ptr) {
|
| // Extract interesting stats
|
| struct TCMallocStats {
|
| uint64_t system_bytes; // Bytes alloced from system
|
| + uint64_t committed_bytes; // Bytes alloced and committed from system
|
| uint64_t thread_bytes; // Bytes in thread caches
|
| uint64_t central_bytes; // Bytes in central cache
|
| uint64_t transfer_bytes; // Bytes in central transfer cache
|
| @@ -398,6 +399,7 @@ static void ExtractStats(TCMallocStats* r, uint64_t* class_count) {
|
| { //scope
|
| SpinLockHolder h(Static::pageheap_lock());
|
| r->system_bytes = Static::pageheap()->SystemBytes();
|
| + r->committed_bytes = Static::pageheap()->CommittedBytes();
|
| r->metadata_bytes = tcmalloc::metadata_system_bytes();
|
| r->pageheap_bytes = Static::pageheap()->FreeBytes();
|
| }
|
| @@ -411,6 +413,20 @@ static void DumpStats(TCMalloc_Printer* out, int level) {
|
|
|
| static const double MB = 1048576.0;
|
|
|
| + const uint64_t bytes_in_use = stats.system_bytes
|
| + - stats.pageheap_bytes
|
| + - stats.central_bytes
|
| + - stats.transfer_bytes
|
| + - stats.thread_bytes;
|
| +
|
| + out->printf("WASTE: %7.1f MB committed but not used\n"
|
| + "WASTE: %7.1f MB bytes committed, %7.1f MB bytes in use\n"
|
| + "WASTE: committed/used ratio of %f\n",
|
| + (stats.committed_bytes - bytes_in_use) / MB,
|
| + stats.committed_bytes / MB,
|
| + bytes_in_use / MB,
|
| + stats.committed_bytes / static_cast<double>(bytes_in_use));
|
| +
|
| if (level >= 2) {
|
| out->printf("------------------------------------------------\n");
|
| uint64_t cumulative = 0;
|
| @@ -435,14 +451,9 @@ static void DumpStats(TCMalloc_Printer* out, int level) {
|
| DumpSystemAllocatorStats(out);
|
| }
|
|
|
| - const uint64_t bytes_in_use = stats.system_bytes
|
| - - stats.pageheap_bytes
|
| - - stats.central_bytes
|
| - - stats.transfer_bytes
|
| - - stats.thread_bytes;
|
| -
|
| out->printf("------------------------------------------------\n"
|
| "MALLOC: %12" PRIu64 " (%7.1f MB) Heap size\n"
|
| + "MALLOC: %12" PRIu64 " (%7.1f MB) Bytes committed\n"
|
| "MALLOC: %12" PRIu64 " (%7.1f MB) Bytes in use by application\n"
|
| "MALLOC: %12" PRIu64 " (%7.1f MB) Bytes free in page heap\n"
|
| "MALLOC: %12" PRIu64 " (%7.1f MB) Bytes free in central cache\n"
|
| @@ -453,6 +464,7 @@ static void DumpStats(TCMalloc_Printer* out, int level) {
|
| "MALLOC: %12" PRIu64 " (%7.1f MB) Metadata allocated\n"
|
| "------------------------------------------------\n",
|
| stats.system_bytes, stats.system_bytes / MB,
|
| + stats.committed_bytes, stats.committed_bytes / MB,
|
| bytes_in_use, bytes_in_use / MB,
|
| stats.pageheap_bytes, stats.pageheap_bytes / MB,
|
| stats.central_bytes, stats.central_bytes / MB,
|
| @@ -571,6 +583,13 @@ class TCMallocImplementation : public MallocExtension {
|
| return true;
|
| }
|
|
|
| + if (strcmp(name, "generic.committed_bytes") == 0) {
|
| + TCMallocStats stats;
|
| + ExtractStats(&stats, NULL);
|
| + *value = Static::pageheap()->CommittedBytes();
|
| + return true;
|
| + }
|
| +
|
| if (strcmp(name, "tcmalloc.slack_bytes") == 0) {
|
| // We assume that bytes in the page heap are not fragmented too
|
| // badly, and are therefore available for allocation.
|
|
|