| Index: src/heap/object-stats.cc
|
| diff --git a/src/heap/object-stats.cc b/src/heap/object-stats.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4cdd8074ff6eef0ddbf0bfc4402abf216875401f
|
| --- /dev/null
|
| +++ b/src/heap/object-stats.cc
|
| @@ -0,0 +1,138 @@
|
| +// Copyright 2015 the V8 project authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "src/heap/object-stats.h"
|
| +
|
| +#include "src/counters.h"
|
| +#include "src/heap/heap-inl.h"
|
| +#include "src/isolate.h"
|
| +#include "src/utils.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +
|
| +static base::LazyMutex object_stats_mutex = LAZY_MUTEX_INITIALIZER;
|
| +
|
| +
|
| +void ObjectStats::ClearObjectStats(bool clear_last_time_stats) {
|
| + memset(object_counts_, 0, sizeof(object_counts_));
|
| + memset(object_sizes_, 0, sizeof(object_sizes_));
|
| + if (clear_last_time_stats) {
|
| + memset(object_counts_last_time_, 0, sizeof(object_counts_last_time_));
|
| + memset(object_sizes_last_time_, 0, sizeof(object_sizes_last_time_));
|
| + }
|
| +}
|
| +
|
| +
|
| +void ObjectStats::TraceObjectStat(const char* name, int count, int size,
|
| + double time) {
|
| + int ms_count = heap()->ms_count();
|
| + PrintIsolate(isolate(),
|
| + "heap:%p, time:%f, gc:%d, type:%s, count:%d, size:%d\n",
|
| + static_cast<void*>(heap()), time, ms_count, name, count, size);
|
| +}
|
| +
|
| +
|
| +void ObjectStats::TraceObjectStats() {
|
| + base::LockGuard<base::Mutex> lock_guard(object_stats_mutex.Pointer());
|
| + int index;
|
| + int count;
|
| + int size;
|
| + int total_size = 0;
|
| + double time = isolate()->time_millis_since_init();
|
| +#define TRACE_OBJECT_COUNT(name) \
|
| + count = static_cast<int>(object_counts_[name]); \
|
| + size = static_cast<int>(object_sizes_[name]) / KB; \
|
| + total_size += size; \
|
| + TraceObjectStat(#name, count, size, time);
|
| + INSTANCE_TYPE_LIST(TRACE_OBJECT_COUNT)
|
| +#undef TRACE_OBJECT_COUNT
|
| +#define TRACE_OBJECT_COUNT(name) \
|
| + index = FIRST_CODE_KIND_SUB_TYPE + Code::name; \
|
| + count = static_cast<int>(object_counts_[index]); \
|
| + size = static_cast<int>(object_sizes_[index]) / KB; \
|
| + TraceObjectStat("*CODE_" #name, count, size, time);
|
| + CODE_KIND_LIST(TRACE_OBJECT_COUNT)
|
| +#undef TRACE_OBJECT_COUNT
|
| +#define TRACE_OBJECT_COUNT(name) \
|
| + index = FIRST_FIXED_ARRAY_SUB_TYPE + name; \
|
| + count = static_cast<int>(object_counts_[index]); \
|
| + size = static_cast<int>(object_sizes_[index]) / KB; \
|
| + TraceObjectStat("*FIXED_ARRAY_" #name, count, size, time);
|
| + FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(TRACE_OBJECT_COUNT)
|
| +#undef TRACE_OBJECT_COUNT
|
| +#define TRACE_OBJECT_COUNT(name) \
|
| + index = \
|
| + FIRST_CODE_AGE_SUB_TYPE + Code::k##name##CodeAge - Code::kFirstCodeAge; \
|
| + count = static_cast<int>(object_counts_[index]); \
|
| + size = static_cast<int>(object_sizes_[index]) / KB; \
|
| + TraceObjectStat("*CODE_AGE_" #name, count, size, time);
|
| + CODE_AGE_LIST_COMPLETE(TRACE_OBJECT_COUNT)
|
| +#undef TRACE_OBJECT_COUNT
|
| +}
|
| +
|
| +
|
| +void ObjectStats::CheckpointObjectStats() {
|
| + base::LockGuard<base::Mutex> lock_guard(object_stats_mutex.Pointer());
|
| + Counters* counters = isolate()->counters();
|
| +#define ADJUST_LAST_TIME_OBJECT_COUNT(name) \
|
| + counters->count_of_##name()->Increment( \
|
| + static_cast<int>(object_counts_[name])); \
|
| + counters->count_of_##name()->Decrement( \
|
| + static_cast<int>(object_counts_last_time_[name])); \
|
| + counters->size_of_##name()->Increment( \
|
| + static_cast<int>(object_sizes_[name])); \
|
| + counters->size_of_##name()->Decrement( \
|
| + static_cast<int>(object_sizes_last_time_[name]));
|
| + INSTANCE_TYPE_LIST(ADJUST_LAST_TIME_OBJECT_COUNT)
|
| +#undef ADJUST_LAST_TIME_OBJECT_COUNT
|
| + int index;
|
| +#define ADJUST_LAST_TIME_OBJECT_COUNT(name) \
|
| + index = FIRST_CODE_KIND_SUB_TYPE + Code::name; \
|
| + counters->count_of_CODE_TYPE_##name()->Increment( \
|
| + static_cast<int>(object_counts_[index])); \
|
| + counters->count_of_CODE_TYPE_##name()->Decrement( \
|
| + static_cast<int>(object_counts_last_time_[index])); \
|
| + counters->size_of_CODE_TYPE_##name()->Increment( \
|
| + static_cast<int>(object_sizes_[index])); \
|
| + counters->size_of_CODE_TYPE_##name()->Decrement( \
|
| + static_cast<int>(object_sizes_last_time_[index]));
|
| + CODE_KIND_LIST(ADJUST_LAST_TIME_OBJECT_COUNT)
|
| +#undef ADJUST_LAST_TIME_OBJECT_COUNT
|
| +#define ADJUST_LAST_TIME_OBJECT_COUNT(name) \
|
| + index = FIRST_FIXED_ARRAY_SUB_TYPE + name; \
|
| + counters->count_of_FIXED_ARRAY_##name()->Increment( \
|
| + static_cast<int>(object_counts_[index])); \
|
| + counters->count_of_FIXED_ARRAY_##name()->Decrement( \
|
| + static_cast<int>(object_counts_last_time_[index])); \
|
| + counters->size_of_FIXED_ARRAY_##name()->Increment( \
|
| + static_cast<int>(object_sizes_[index])); \
|
| + counters->size_of_FIXED_ARRAY_##name()->Decrement( \
|
| + static_cast<int>(object_sizes_last_time_[index]));
|
| + FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(ADJUST_LAST_TIME_OBJECT_COUNT)
|
| +#undef ADJUST_LAST_TIME_OBJECT_COUNT
|
| +#define ADJUST_LAST_TIME_OBJECT_COUNT(name) \
|
| + index = \
|
| + FIRST_CODE_AGE_SUB_TYPE + Code::k##name##CodeAge - Code::kFirstCodeAge; \
|
| + counters->count_of_CODE_AGE_##name()->Increment( \
|
| + static_cast<int>(object_counts_[index])); \
|
| + counters->count_of_CODE_AGE_##name()->Decrement( \
|
| + static_cast<int>(object_counts_last_time_[index])); \
|
| + counters->size_of_CODE_AGE_##name()->Increment( \
|
| + static_cast<int>(object_sizes_[index])); \
|
| + counters->size_of_CODE_AGE_##name()->Decrement( \
|
| + static_cast<int>(object_sizes_last_time_[index]));
|
| + CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
|
| +#undef ADJUST_LAST_TIME_OBJECT_COUNT
|
| +
|
| + MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
|
| + MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
|
| + ClearObjectStats();
|
| +}
|
| +
|
| +
|
| +Isolate* ObjectStats::isolate() { return heap()->isolate(); }
|
| +
|
| +} // namespace internal
|
| +} // namespace v8
|
|
|