Line data Source code
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
3 : // found in the LICENSE file.
4 :
5 : #ifndef V8_HEAP_OBJECT_STATS_H_
6 : #define V8_HEAP_OBJECT_STATS_H_
7 :
8 : #include "src/objects.h"
9 : #include "src/objects/code.h"
10 :
11 : // These instance types do not exist for actual use but are merely introduced
12 : // for object stats tracing. In contrast to Code and FixedArray sub types
13 : // these types are not known to other counters outside of object stats
14 : // tracing.
15 : //
16 : // Update LAST_VIRTUAL_TYPE below when changing this macro.
17 : #define VIRTUAL_INSTANCE_TYPE_LIST(V) \
18 : CODE_KIND_LIST(V) \
19 : V(ARRAY_BOILERPLATE_DESCRIPTION_ELEMENTS_TYPE) \
20 : V(ARRAY_DICTIONARY_ELEMENTS_TYPE) \
21 : V(ARRAY_ELEMENTS_TYPE) \
22 : V(BOILERPLATE_ELEMENTS_TYPE) \
23 : V(BOILERPLATE_PROPERTY_ARRAY_TYPE) \
24 : V(BOILERPLATE_PROPERTY_DICTIONARY_TYPE) \
25 : V(BYTECODE_ARRAY_CONSTANT_POOL_TYPE) \
26 : V(BYTECODE_ARRAY_HANDLER_TABLE_TYPE) \
27 : V(COW_ARRAY_TYPE) \
28 : V(DEOPTIMIZATION_DATA_TYPE) \
29 : V(DEPENDENT_CODE_TYPE) \
30 : V(DEPRECATED_DESCRIPTOR_ARRAY_TYPE) \
31 : V(EMBEDDED_OBJECT_TYPE) \
32 : V(ENUM_KEYS_CACHE_TYPE) \
33 : V(ENUM_INDICES_CACHE_TYPE) \
34 : V(FEEDBACK_VECTOR_ENTRY_TYPE) \
35 : V(FEEDBACK_VECTOR_HEADER_TYPE) \
36 : V(FEEDBACK_VECTOR_SLOT_CALL_TYPE) \
37 : V(FEEDBACK_VECTOR_SLOT_CALL_UNUSED_TYPE) \
38 : V(FEEDBACK_VECTOR_SLOT_ENUM_TYPE) \
39 : V(FEEDBACK_VECTOR_SLOT_LOAD_TYPE) \
40 : V(FEEDBACK_VECTOR_SLOT_LOAD_UNUSED_TYPE) \
41 : V(FEEDBACK_VECTOR_SLOT_OTHER_TYPE) \
42 : V(FEEDBACK_VECTOR_SLOT_STORE_TYPE) \
43 : V(FEEDBACK_VECTOR_SLOT_STORE_UNUSED_TYPE) \
44 : V(FUNCTION_TEMPLATE_INFO_ENTRIES_TYPE) \
45 : V(GLOBAL_ELEMENTS_TYPE) \
46 : V(GLOBAL_PROPERTIES_TYPE) \
47 : V(JS_ARRAY_BOILERPLATE_TYPE) \
48 : V(JS_COLLECTION_TABLE_TYPE) \
49 : V(JS_OBJECT_BOILERPLATE_TYPE) \
50 : V(JS_UNCOMPILED_FUNCTION_TYPE) \
51 : V(MAP_ABANDONED_PROTOTYPE_TYPE) \
52 : V(MAP_DEPRECATED_TYPE) \
53 : V(MAP_DICTIONARY_TYPE) \
54 : V(MAP_PROTOTYPE_DICTIONARY_TYPE) \
55 : V(MAP_PROTOTYPE_TYPE) \
56 : V(MAP_STABLE_TYPE) \
57 : V(NOSCRIPT_SHARED_FUNCTION_INFOS_TYPE) \
58 : V(NUMBER_STRING_CACHE_TYPE) \
59 : V(OBJECT_DICTIONARY_ELEMENTS_TYPE) \
60 : V(OBJECT_ELEMENTS_TYPE) \
61 : V(OBJECT_PROPERTY_ARRAY_TYPE) \
62 : V(OBJECT_PROPERTY_DICTIONARY_TYPE) \
63 : V(OBJECT_TO_CODE_TYPE) \
64 : V(OPTIMIZED_CODE_LITERALS_TYPE) \
65 : V(OTHER_CONTEXT_TYPE) \
66 : V(PROTOTYPE_DESCRIPTOR_ARRAY_TYPE) \
67 : V(PROTOTYPE_PROPERTY_ARRAY_TYPE) \
68 : V(PROTOTYPE_PROPERTY_DICTIONARY_TYPE) \
69 : V(PROTOTYPE_USERS_TYPE) \
70 : V(REGEXP_MULTIPLE_CACHE_TYPE) \
71 : V(RELOC_INFO_TYPE) \
72 : V(RETAINED_MAPS_TYPE) \
73 : V(SCRIPT_LIST_TYPE) \
74 : V(SCRIPT_SHARED_FUNCTION_INFOS_TYPE) \
75 : V(SCRIPT_SOURCE_EXTERNAL_ONE_BYTE_TYPE) \
76 : V(SCRIPT_SOURCE_EXTERNAL_TWO_BYTE_TYPE) \
77 : V(SCRIPT_SOURCE_NON_EXTERNAL_ONE_BYTE_TYPE) \
78 : V(SCRIPT_SOURCE_NON_EXTERNAL_TWO_BYTE_TYPE) \
79 : V(SERIALIZED_OBJECTS_TYPE) \
80 : V(SINGLE_CHARACTER_STRING_CACHE_TYPE) \
81 : V(STRING_SPLIT_CACHE_TYPE) \
82 : V(STRING_EXTERNAL_RESOURCE_ONE_BYTE_TYPE) \
83 : V(STRING_EXTERNAL_RESOURCE_TWO_BYTE_TYPE) \
84 : V(SOURCE_POSITION_TABLE_TYPE) \
85 : V(UNCOMPILED_SHARED_FUNCTION_INFO_TYPE) \
86 : V(WEAK_NEW_SPACE_OBJECT_TO_CODE_TYPE)
87 :
88 : namespace v8 {
89 : namespace internal {
90 :
91 : class Heap;
92 : class Isolate;
93 :
94 : class ObjectStats {
95 : public:
96 : static const size_t kNoOverAllocation = 0;
97 :
98 0 : explicit ObjectStats(Heap* heap) : heap_(heap) { ClearObjectStats(); }
99 :
100 : // See description on VIRTUAL_INSTANCE_TYPE_LIST.
101 : enum VirtualInstanceType {
102 : #define DEFINE_VIRTUAL_INSTANCE_TYPE(type) type,
103 : VIRTUAL_INSTANCE_TYPE_LIST(DEFINE_VIRTUAL_INSTANCE_TYPE)
104 : #undef DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE
105 : LAST_VIRTUAL_TYPE = WEAK_NEW_SPACE_OBJECT_TO_CODE_TYPE,
106 : };
107 :
108 : // ObjectStats are kept in two arrays, counts and sizes. Related stats are
109 : // stored in a contiguous linear buffer. Stats groups are stored one after
110 : // another.
111 : enum {
112 : FIRST_VIRTUAL_TYPE = LAST_TYPE + 1,
113 : OBJECT_STATS_COUNT = FIRST_VIRTUAL_TYPE + LAST_VIRTUAL_TYPE + 1,
114 : };
115 :
116 : void ClearObjectStats(bool clear_last_time_stats = false);
117 :
118 : void PrintJSON(const char* key);
119 : void Dump(std::stringstream& stream);
120 :
121 : void CheckpointObjectStats();
122 : void RecordObjectStats(InstanceType type, size_t size,
123 : size_t over_allocated = kNoOverAllocation);
124 : void RecordVirtualObjectStats(VirtualInstanceType type, size_t size,
125 : size_t over_allocated);
126 :
127 : size_t object_count_last_gc(size_t index) {
128 0 : return object_counts_last_time_[index];
129 : }
130 :
131 : size_t object_size_last_gc(size_t index) {
132 0 : return object_sizes_last_time_[index];
133 : }
134 :
135 : Isolate* isolate();
136 : Heap* heap() { return heap_; }
137 :
138 : private:
139 : static const int kFirstBucketShift = 5; // <32
140 : static const int kLastBucketShift = 20; // >=1M
141 : static const int kFirstBucket = 1 << kFirstBucketShift;
142 : static const int kLastBucket = 1 << kLastBucketShift;
143 : static const int kNumberOfBuckets = kLastBucketShift - kFirstBucketShift + 1;
144 : static const int kLastValueBucketIndex = kLastBucketShift - kFirstBucketShift;
145 :
146 : void PrintKeyAndId(const char* key, int gc_count);
147 : // The following functions are excluded from inline to reduce the overall
148 : // binary size of VB. On x64 this save around 80KB.
149 : V8_NOINLINE void PrintInstanceTypeJSON(const char* key, int gc_count,
150 : const char* name, int index);
151 : V8_NOINLINE void DumpInstanceTypeData(std::stringstream& stream,
152 : const char* name, int index);
153 :
154 : int HistogramIndexFromSize(size_t size);
155 :
156 : Heap* heap_;
157 : // Object counts and used memory by InstanceType.
158 : size_t object_counts_[OBJECT_STATS_COUNT];
159 : size_t object_counts_last_time_[OBJECT_STATS_COUNT];
160 : size_t object_sizes_[OBJECT_STATS_COUNT];
161 : size_t object_sizes_last_time_[OBJECT_STATS_COUNT];
162 : // Approximation of overallocated memory by InstanceType.
163 : size_t over_allocated_[OBJECT_STATS_COUNT];
164 : // Detailed histograms by InstanceType.
165 : size_t size_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets];
166 : size_t over_allocated_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets];
167 :
168 : size_t tagged_fields_count_;
169 : size_t embedder_fields_count_;
170 : size_t unboxed_double_fields_count_;
171 : size_t raw_fields_count_;
172 :
173 : friend class ObjectStatsCollectorImpl;
174 : };
175 :
176 : class ObjectStatsCollector {
177 : public:
178 : ObjectStatsCollector(Heap* heap, ObjectStats* live, ObjectStats* dead)
179 0 : : heap_(heap), live_(live), dead_(dead) {
180 : DCHECK_NOT_NULL(heap_);
181 : DCHECK_NOT_NULL(live_);
182 : DCHECK_NOT_NULL(dead_);
183 : }
184 :
185 : // Collects type information of live and dead objects. Requires mark bits to
186 : // be present.
187 : void Collect();
188 :
189 : private:
190 : Heap* const heap_;
191 : ObjectStats* const live_;
192 : ObjectStats* const dead_;
193 : };
194 :
195 : } // namespace internal
196 : } // namespace v8
197 :
198 : #endif // V8_HEAP_OBJECT_STATS_H_
|