OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_HEAP_OBJECT_STATS_H_ | 5 #ifndef V8_HEAP_OBJECT_STATS_H_ |
6 #define V8_HEAP_OBJECT_STATS_H_ | 6 #define V8_HEAP_OBJECT_STATS_H_ |
7 | 7 |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "src/base/ieee754.h" | 10 #include "src/base/ieee754.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 code_age_index < OBJECT_STATS_COUNT); | 53 code_age_index < OBJECT_STATS_COUNT); |
54 object_counts_[code_sub_type_index]++; | 54 object_counts_[code_sub_type_index]++; |
55 object_sizes_[code_sub_type_index] += size; | 55 object_sizes_[code_sub_type_index] += size; |
56 object_counts_[code_age_index]++; | 56 object_counts_[code_age_index]++; |
57 object_sizes_[code_age_index] += size; | 57 object_sizes_[code_age_index] += size; |
58 const int idx = HistogramIndexFromSize(size); | 58 const int idx = HistogramIndexFromSize(size); |
59 size_histogram_[code_sub_type_index][idx]++; | 59 size_histogram_[code_sub_type_index][idx]++; |
60 size_histogram_[code_age_index][idx]++; | 60 size_histogram_[code_age_index][idx]++; |
61 } | 61 } |
62 | 62 |
63 void RecordFixedArraySubTypeStats(FixedArrayBase* array, int array_sub_type, | 63 bool RecordFixedArraySubTypeStats(FixedArrayBase* array, int array_sub_type, |
64 size_t size, size_t over_allocated) { | 64 size_t size, size_t over_allocated) { |
65 auto it = visited_fixed_array_sub_types_.insert(array); | 65 auto it = visited_fixed_array_sub_types_.insert(array); |
66 if (!it.second) return; | 66 if (!it.second) return false; |
67 DCHECK(array_sub_type <= LAST_FIXED_ARRAY_SUB_TYPE); | 67 DCHECK(array_sub_type <= LAST_FIXED_ARRAY_SUB_TYPE); |
68 object_counts_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type]++; | 68 object_counts_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type]++; |
69 object_sizes_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] += size; | 69 object_sizes_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] += size; |
70 size_histogram_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] | 70 size_histogram_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] |
71 [HistogramIndexFromSize(size)]++; | 71 [HistogramIndexFromSize(size)]++; |
72 over_allocated_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] += | 72 if (over_allocated > 0) { |
73 over_allocated; | 73 over_allocated_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] += |
74 over_allocated_histogram_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] | 74 over_allocated; |
75 [HistogramIndexFromSize(over_allocated)]++; | 75 over_allocated_histogram_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] |
| 76 [HistogramIndexFromSize(over_allocated)]++; |
| 77 } |
| 78 return true; |
76 } | 79 } |
77 | 80 |
78 size_t object_count_last_gc(size_t index) { | 81 size_t object_count_last_gc(size_t index) { |
79 return object_counts_last_time_[index]; | 82 return object_counts_last_time_[index]; |
80 } | 83 } |
81 | 84 |
82 size_t object_size_last_gc(size_t index) { | 85 size_t object_size_last_gc(size_t index) { |
83 return object_sizes_last_time_[index]; | 86 return object_sizes_last_time_[index]; |
84 } | 87 } |
85 | 88 |
(...skipping 24 matching lines...) Expand all Loading... |
110 size_t over_allocated_[OBJECT_STATS_COUNT]; | 113 size_t over_allocated_[OBJECT_STATS_COUNT]; |
111 // Detailed histograms by InstanceType. | 114 // Detailed histograms by InstanceType. |
112 size_t size_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets]; | 115 size_t size_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets]; |
113 size_t over_allocated_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets]; | 116 size_t over_allocated_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets]; |
114 | 117 |
115 std::set<FixedArrayBase*> visited_fixed_array_sub_types_; | 118 std::set<FixedArrayBase*> visited_fixed_array_sub_types_; |
116 }; | 119 }; |
117 | 120 |
118 class ObjectStatsCollector { | 121 class ObjectStatsCollector { |
119 public: | 122 public: |
120 static void CollectStatistics(ObjectStats* stats, HeapObject* obj); | 123 ObjectStatsCollector(Heap* heap, ObjectStats* stats) |
| 124 : heap_(heap), stats_(stats) {} |
| 125 |
| 126 void CollectGlobalStatistics(); |
| 127 void CollectStatistics(HeapObject* obj); |
121 | 128 |
122 private: | 129 private: |
123 static void RecordMapDetails(ObjectStats* stats, Heap* heap, HeapObject* obj); | 130 void RecordCodeDetails(Code* code); |
124 static void RecordCodeDetails(ObjectStats* stats, Heap* heap, | 131 void RecordFixedArrayDetails(FixedArray* array); |
125 HeapObject* obj); | 132 void RecordJSCollectionDetails(JSObject* obj); |
126 static void RecordSharedFunctionInfoDetails(ObjectStats* stats, Heap* heap, | 133 void RecordJSFunctionDetails(JSFunction* function); |
127 HeapObject* obj); | 134 void RecordJSObjectDetails(JSObject* object); |
128 static void RecordFixedArrayDetails(ObjectStats* stats, Heap* heap, | 135 void RecordJSWeakCollectionDetails(JSWeakCollection* obj); |
129 HeapObject* obj); | 136 void RecordMapDetails(Map* map); |
| 137 void RecordScriptDetails(Script* obj); |
| 138 void RecordSharedFunctionInfoDetails(SharedFunctionInfo* sfi); |
130 | 139 |
131 static void RecordJSObjectDetails(ObjectStats* stats, Heap* heap, | 140 bool RecordFixedArrayHelper(HeapObject* parent, FixedArray* array, |
132 JSObject* object); | 141 int subtype, size_t overhead); |
133 static void RecordJSWeakCollectionDetails(ObjectStats* stats, Heap* heap, | 142 void RecursivelyRecordFixedArrayHelper(HeapObject* parent, FixedArray* array, |
134 JSWeakCollection* obj); | 143 int subtype); |
135 static void RecordScriptDetails(ObjectStats* stats, Heap* heap, Script* obj); | 144 template <class HashTable> |
136 | 145 void RecordHashTableHelper(HeapObject* parent, HashTable* array, int subtype); |
137 static void RecordFixedArrayHelper(ObjectStats* stats, Heap* heap, | 146 Heap* heap_; |
138 HeapObject* parent, FixedArray* array, | 147 ObjectStats* stats_; |
139 int subtype, size_t overhead); | |
140 }; | 148 }; |
141 | 149 |
142 } // namespace internal | 150 } // namespace internal |
143 } // namespace v8 | 151 } // namespace v8 |
144 | 152 |
145 #endif // V8_HEAP_OBJECT_STATS_H_ | 153 #endif // V8_HEAP_OBJECT_STATS_H_ |
OLD | NEW |