Chromium Code Reviews| Index: src/heap/object-stats.cc |
| diff --git a/src/heap/object-stats.cc b/src/heap/object-stats.cc |
| index dd2adc3d9223a7c1961abaa8b2c9a9445fe2de23..4bc94bafe82dade2fc1637e6b855fc6d796bec06 100644 |
| --- a/src/heap/object-stats.cc |
| +++ b/src/heap/object-stats.cc |
| @@ -42,6 +42,16 @@ V8_NOINLINE static void PrintJSONArray(size_t* array, const int len) { |
| PrintF(" ]"); |
| } |
| +V8_NOINLINE static void DumpJSONArray(std::stringstream& stream, size_t* array, |
|
fmeawad
2016/09/30 00:44:05
I think you should merge the print and dump functi
Michael Lippautz
2016/09/30 09:09:44
Please merge the printing and dumping where possib
lpy
2016/09/30 18:21:58
I am not sure if we should, PrintF will end up cal
|
| + const int len) { |
| + stream << "["; |
| + for (int i = 0; i < len; i++) { |
| + stream << array[i]; |
| + if (i != (len - 1)) stream << ","; |
| + } |
| + stream << "]"; |
| +} |
| + |
| void ObjectStats::PrintJSON(const char* key) { |
| double time = isolate()->time_millis_since_init(); |
| int gc_count = heap()->gc_count(); |
| @@ -102,6 +112,60 @@ void ObjectStats::PrintJSON(const char* key) { |
| #undef FIXED_ARRAY_SUB_INSTANCE_TYPE_WRAPPER |
| #undef CODE_AGE_WRAPPER |
| #undef PRINT_INSTANCE_TYPE_DATA |
| +#undef PRINT_KEY_AND_ID |
| +} |
| + |
| +void ObjectStats::Dump(std::stringstream& stream) { |
| + double time = isolate()->time_millis_since_init(); |
| + int gc_count = heap()->gc_count(); |
| + |
| + stream << "{"; |
| + stream << "\"isolate\":\"" << reinterpret_cast<void*>(isolate()) << "\","; |
| + stream << "\"id\":" << gc_count << ","; |
| + stream << "\"time\":" << time << ","; |
| + stream << "\"bucket_sizes\":["; |
| + for (int i = 0; i < kNumberOfBuckets; i++) { |
| + stream << (1 << (kFirstBucketShift + i)); |
| + if (i != (kNumberOfBuckets - 1)) stream << ","; |
| + } |
| + stream << "],"; |
| + stream << "\"type_data\":{"; |
| + |
| +#define PRINT_INSTANCE_TYPE_DATA(name, index) \ |
| + stream << "\"" << name << "\":{"; \ |
| + stream << "\"type\":" << static_cast<int>(index) << ","; \ |
| + stream << "\"overall\":" << object_sizes_[index] << ","; \ |
| + stream << "\"count\":" << object_counts_[index] << ","; \ |
| + stream << "\"over_allocated\":" << over_allocated_[index] << ","; \ |
| + stream << "\"histogram\":"; \ |
| + DumpJSONArray(stream, size_histogram_[index], kNumberOfBuckets); \ |
| + stream << ",\"over_allocated_histogram\":"; \ |
| + DumpJSONArray(stream, over_allocated_histogram_[index], kNumberOfBuckets); \ |
| + stream << "},"; |
| + |
| +#define INSTANCE_TYPE_WRAPPER(name) PRINT_INSTANCE_TYPE_DATA(#name, name) |
| +#define CODE_KIND_WRAPPER(name) \ |
| + PRINT_INSTANCE_TYPE_DATA("*CODE_" #name, \ |
| + FIRST_CODE_KIND_SUB_TYPE + Code::name) |
| +#define FIXED_ARRAY_SUB_INSTANCE_TYPE_WRAPPER(name) \ |
| + PRINT_INSTANCE_TYPE_DATA("*FIXED_ARRAY_" #name, \ |
| + FIRST_FIXED_ARRAY_SUB_TYPE + name) |
| +#define CODE_AGE_WRAPPER(name) \ |
| + PRINT_INSTANCE_TYPE_DATA( \ |
| + "*CODE_AGE_" #name, \ |
| + FIRST_CODE_AGE_SUB_TYPE + Code::k##name##CodeAge - Code::kFirstCodeAge) |
| + |
| + INSTANCE_TYPE_LIST(INSTANCE_TYPE_WRAPPER); |
| + CODE_KIND_LIST(CODE_KIND_WRAPPER); |
| + FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(FIXED_ARRAY_SUB_INSTANCE_TYPE_WRAPPER); |
| + CODE_AGE_LIST_COMPLETE(CODE_AGE_WRAPPER); |
| + stream << "\"END\":{}}}"; |
| + |
| +#undef INSTANCE_TYPE_WRAPPER |
| +#undef CODE_KIND_WRAPPER |
| +#undef FIXED_ARRAY_SUB_INSTANCE_TYPE_WRAPPER |
| +#undef CODE_AGE_WRAPPER |
| +#undef PRINT_INSTANCE_TYPE_DATA |
| } |
| void ObjectStats::CheckpointObjectStats() { |