Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index faaa85236109ee4c37595dde7eeca8980010c30e..9c6a2a1690cdba36130ba3147302a84acf43d45d 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -23,6 +23,7 @@ |
#include "src/heap/mark-compact-inl.h" |
#include "src/heap/mark-compact.h" |
#include "src/heap/memory-reducer.h" |
+#include "src/heap/object-stats.h" |
#include "src/heap/objects-visiting-inl.h" |
#include "src/heap/objects-visiting.h" |
#include "src/heap/store-buffer.h" |
@@ -122,6 +123,7 @@ Heap::Heap() |
store_buffer_(this), |
incremental_marking_(this), |
memory_reducer_(nullptr), |
+ object_stats_(nullptr), |
full_codegen_bytes_generated_(0), |
crankshaft_codegen_bytes_generated_(0), |
new_space_allocation_counter_(0), |
@@ -161,8 +163,6 @@ Heap::Heap() |
// Put a dummy entry in the remembered pages so we can find the list the |
// minidump even if there are no real unmapped pages. |
RememberUnmappedPage(NULL, false); |
- |
- ClearObjectStats(true); |
} |
@@ -5643,6 +5643,9 @@ bool Heap::SetUp() { |
memory_reducer_ = new MemoryReducer(this); |
+ object_stats_ = new ObjectStats(this); |
+ object_stats_->ClearObjectStats(true); |
+ |
LOG(isolate_, IntPtrTEvent("heap-capacity", Capacity())); |
LOG(isolate_, IntPtrTEvent("heap-available", Available())); |
@@ -5753,6 +5756,9 @@ void Heap::TearDown() { |
memory_reducer_ = nullptr; |
} |
+ delete object_stats_; |
+ object_stats_ = nullptr; |
+ |
WaitUntilUnmappingOfFreeChunksCompleted(); |
TearDownArrayBuffers(); |
@@ -6573,124 +6579,6 @@ void Heap::RememberUnmappedPage(Address page, bool compacted) { |
} |
-void Heap::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_)); |
- } |
-} |
- |
- |
-static base::LazyMutex object_stats_mutex = LAZY_MUTEX_INITIALIZER; |
- |
- |
-void Heap::TraceObjectStat(const char* name, int count, int size, double time) { |
- PrintIsolate(isolate_, |
- "heap:%p, time:%f, gc:%d, type:%s, count:%d, size:%d\n", |
- static_cast<void*>(this), time, ms_count_, name, count, size); |
-} |
- |
- |
-void Heap::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 Heap::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(); |
-} |
- |
- |
void Heap::RegisterStrongRoots(Object** start, Object** end) { |
StrongRootsList* list = new StrongRootsList(); |
list->next = strong_roots_list_; |
@@ -6720,9 +6608,26 @@ void Heap::UnregisterStrongRoots(Object** start) { |
} |
+size_t Heap::NumberOfTrackedHeapObjectTypes() { |
+ return ObjectStats::OBJECT_STATS_COUNT; |
+} |
+ |
+ |
+size_t Heap::ObjectCountAtLastGC(size_t index) { |
+ if (index >= ObjectStats::OBJECT_STATS_COUNT) return 0; |
+ return object_stats_->object_count_last_gc(index); |
+} |
+ |
+ |
+size_t Heap::ObjectSizeAtLastGC(size_t index) { |
+ if (index >= ObjectStats::OBJECT_STATS_COUNT) return 0; |
+ return object_stats_->object_size_last_gc(index); |
+} |
+ |
+ |
bool Heap::GetObjectTypeName(size_t index, const char** object_type, |
const char** object_sub_type) { |
- if (index >= OBJECT_STATS_COUNT) return false; |
+ if (index >= ObjectStats::OBJECT_STATS_COUNT) return false; |
switch (static_cast<int>(index)) { |
#define COMPARE_AND_RETURN_NAME(name) \ |
@@ -6732,29 +6637,31 @@ bool Heap::GetObjectTypeName(size_t index, const char** object_type, |
return true; |
INSTANCE_TYPE_LIST(COMPARE_AND_RETURN_NAME) |
#undef COMPARE_AND_RETURN_NAME |
-#define COMPARE_AND_RETURN_NAME(name) \ |
- case FIRST_CODE_KIND_SUB_TYPE + Code::name: \ |
- *object_type = "CODE_TYPE"; \ |
- *object_sub_type = "CODE_KIND/" #name; \ |
+#define COMPARE_AND_RETURN_NAME(name) \ |
+ case ObjectStats::FIRST_CODE_KIND_SUB_TYPE + Code::name: \ |
+ *object_type = "CODE_TYPE"; \ |
+ *object_sub_type = "CODE_KIND/" #name; \ |
return true; |
CODE_KIND_LIST(COMPARE_AND_RETURN_NAME) |
#undef COMPARE_AND_RETURN_NAME |
-#define COMPARE_AND_RETURN_NAME(name) \ |
- case FIRST_FIXED_ARRAY_SUB_TYPE + name: \ |
- *object_type = "FIXED_ARRAY_TYPE"; \ |
- *object_sub_type = #name; \ |
+#define COMPARE_AND_RETURN_NAME(name) \ |
+ case ObjectStats::FIRST_FIXED_ARRAY_SUB_TYPE + name: \ |
+ *object_type = "FIXED_ARRAY_TYPE"; \ |
+ *object_sub_type = #name; \ |
return true; |
FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(COMPARE_AND_RETURN_NAME) |
#undef COMPARE_AND_RETURN_NAME |
-#define COMPARE_AND_RETURN_NAME(name) \ |
- case FIRST_CODE_AGE_SUB_TYPE + Code::k##name##CodeAge - Code::kFirstCodeAge: \ |
- *object_type = "CODE_TYPE"; \ |
- *object_sub_type = "CODE_AGE/" #name; \ |
+#define COMPARE_AND_RETURN_NAME(name) \ |
+ case ObjectStats::FIRST_CODE_AGE_SUB_TYPE + Code::k##name##CodeAge - \ |
+ Code::kFirstCodeAge: \ |
+ *object_type = "CODE_TYPE"; \ |
+ *object_sub_type = "CODE_AGE/" #name; \ |
return true; |
CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) |
#undef COMPARE_AND_RETURN_NAME |
} |
return false; |
} |
+ |
} // namespace internal |
} // namespace v8 |