5 #ifndef V8_HEAP_OBJECT_STATS_H_ 6 #define V8_HEAP_OBJECT_STATS_H_ 8 #include "src/objects.h" 9 #include "src/objects/code.h" 17 #define VIRTUAL_INSTANCE_TYPE_LIST(V) \ 19 V(ARRAY_BOILERPLATE_DESCRIPTION_ELEMENTS_TYPE) \ 20 V(BOILERPLATE_ELEMENTS_TYPE) \ 21 V(BOILERPLATE_PROPERTY_ARRAY_TYPE) \ 22 V(BOILERPLATE_PROPERTY_DICTIONARY_TYPE) \ 23 V(BYTECODE_ARRAY_CONSTANT_POOL_TYPE) \ 24 V(BYTECODE_ARRAY_HANDLER_TABLE_TYPE) \ 25 V(CODE_STUBS_TABLE_TYPE) \ 27 V(DEOPTIMIZATION_DATA_TYPE) \ 28 V(DEPENDENT_CODE_TYPE) \ 30 V(EMBEDDED_OBJECT_TYPE) \ 32 V(ENUM_INDICES_CACHE_TYPE) \ 33 V(FEEDBACK_VECTOR_ENTRY_TYPE) \ 34 V(FEEDBACK_VECTOR_HEADER_TYPE) \ 35 V(FEEDBACK_VECTOR_SLOT_CALL_TYPE) \ 36 V(FEEDBACK_VECTOR_SLOT_CALL_UNUSED_TYPE) \ 37 V(FEEDBACK_VECTOR_SLOT_ENUM_TYPE) \ 38 V(FEEDBACK_VECTOR_SLOT_LOAD_TYPE) \ 39 V(FEEDBACK_VECTOR_SLOT_LOAD_UNUSED_TYPE) \ 40 V(FEEDBACK_VECTOR_SLOT_OTHER_TYPE) \ 41 V(FEEDBACK_VECTOR_SLOT_STORE_TYPE) \ 42 V(FEEDBACK_VECTOR_SLOT_STORE_UNUSED_TYPE) \ 43 V(FUNCTION_TEMPLATE_INFO_ENTRIES_TYPE) \ 44 V(GLOBAL_ELEMENTS_TYPE) \ 45 V(GLOBAL_PROPERTIES_TYPE) \ 46 V(JS_ARRAY_BOILERPLATE_TYPE) \ 47 V(JS_COLLECTION_TABLE_TYPE) \ 48 V(JS_OBJECT_BOILERPLATE_TYPE) \ 49 V(NOSCRIPT_SHARED_FUNCTION_INFOS_TYPE) \ 50 V(NUMBER_STRING_CACHE_TYPE) \ 51 V(OBJECT_PROPERTY_DICTIONARY_TYPE) \ 52 V(OBJECT_TO_CODE_TYPE) \ 53 V(OPTIMIZED_CODE_LITERALS_TYPE) \ 54 V(OTHER_CONTEXT_TYPE) \ 55 V(PROTOTYPE_USERS_TYPE) \ 56 V(REGEXP_MULTIPLE_CACHE_TYPE) \ 58 V(RETAINED_MAPS_TYPE) \ 60 V(SCRIPT_SHARED_FUNCTION_INFOS_TYPE) \ 61 V(SCRIPT_SOURCE_EXTERNAL_ONE_BYTE_TYPE) \ 62 V(SCRIPT_SOURCE_EXTERNAL_TWO_BYTE_TYPE) \ 63 V(SCRIPT_SOURCE_NON_EXTERNAL_ONE_BYTE_TYPE) \ 64 V(SCRIPT_SOURCE_NON_EXTERNAL_TWO_BYTE_TYPE) \ 65 V(SERIALIZED_OBJECTS_TYPE) \ 66 V(SINGLE_CHARACTER_STRING_CACHE_TYPE) \ 67 V(STRING_SPLIT_CACHE_TYPE) \ 68 V(STRING_EXTERNAL_RESOURCE_ONE_BYTE_TYPE) \ 69 V(STRING_EXTERNAL_RESOURCE_TWO_BYTE_TYPE) \ 70 V(SOURCE_POSITION_TABLE_TYPE) \ 71 V(UNCOMPILED_JS_FUNCTION_TYPE) \ 72 V(UNCOMPILED_SHARED_FUNCTION_INFO_TYPE) \ 73 V(WEAK_NEW_SPACE_OBJECT_TO_CODE_TYPE) 83 static const size_t kNoOverAllocation = 0;
88 enum VirtualInstanceType {
89 #define DEFINE_VIRTUAL_INSTANCE_TYPE(type) type, 90 VIRTUAL_INSTANCE_TYPE_LIST(DEFINE_VIRTUAL_INSTANCE_TYPE)
91 #undef DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE 92 LAST_VIRTUAL_TYPE = WEAK_NEW_SPACE_OBJECT_TO_CODE_TYPE,
99 FIRST_VIRTUAL_TYPE = LAST_TYPE + 1,
100 OBJECT_STATS_COUNT = FIRST_VIRTUAL_TYPE + LAST_VIRTUAL_TYPE + 1,
103 void ClearObjectStats(
bool clear_last_time_stats =
false);
105 void PrintJSON(
const char* key);
106 void Dump(std::stringstream& stream);
108 void CheckpointObjectStats();
109 void RecordObjectStats(InstanceType
type,
size_t size);
110 void RecordVirtualObjectStats(VirtualInstanceType
type,
size_t size,
111 size_t over_allocated);
113 size_t object_count_last_gc(
size_t index) {
114 return object_counts_last_time_[index];
117 size_t object_size_last_gc(
size_t index) {
118 return object_sizes_last_time_[index];
122 Heap* heap() {
return heap_; }
125 static const int kFirstBucketShift = 5;
126 static const int kLastBucketShift = 20;
127 static const int kFirstBucket = 1 << kFirstBucketShift;
128 static const int kLastBucket = 1 << kLastBucketShift;
129 static const int kNumberOfBuckets = kLastBucketShift - kFirstBucketShift + 1;
130 static const int kLastValueBucketIndex = kLastBucketShift - kFirstBucketShift;
132 void PrintKeyAndId(
const char* key,
int gc_count);
135 V8_NOINLINE
void PrintInstanceTypeJSON(
const char* key,
int gc_count,
136 const char* name,
int index);
137 V8_NOINLINE
void DumpInstanceTypeData(std::stringstream& stream,
138 const char* name,
int index);
140 int HistogramIndexFromSize(
size_t size);
144 size_t object_counts_[OBJECT_STATS_COUNT];
145 size_t object_counts_last_time_[OBJECT_STATS_COUNT];
146 size_t object_sizes_[OBJECT_STATS_COUNT];
147 size_t object_sizes_last_time_[OBJECT_STATS_COUNT];
149 size_t over_allocated_[OBJECT_STATS_COUNT];
151 size_t size_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets];
152 size_t over_allocated_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets];
154 size_t tagged_fields_count_;
155 size_t embedder_fields_count_;
156 size_t unboxed_double_fields_count_;
157 size_t raw_fields_count_;
165 : heap_(heap), live_(live), dead_(dead) {
166 DCHECK_NOT_NULL(heap_);
167 DCHECK_NOT_NULL(live_);
168 DCHECK_NOT_NULL(dead_);
184 #endif // V8_HEAP_OBJECT_STATS_H_