v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
object-stats.h
Go to the documentation of this file.
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/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 InstructionStream and FixedArray sub
13// types 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(NUMBER_STRING_CACHE_TYPE) \
58 V(OBJECT_DICTIONARY_ELEMENTS_TYPE) \
59 V(OBJECT_ELEMENTS_TYPE) \
60 V(OBJECT_PROPERTY_ARRAY_TYPE) \
61 V(OBJECT_PROPERTY_DICTIONARY_TYPE) \
62 V(OBJECT_TO_CODE_TYPE) \
63 V(OPTIMIZED_CODE_LITERALS_TYPE) \
64 V(OTHER_CONTEXT_TYPE) \
65 V(PROTOTYPE_DESCRIPTOR_ARRAY_TYPE) \
66 V(PROTOTYPE_PROPERTY_ARRAY_TYPE) \
67 V(PROTOTYPE_PROPERTY_DICTIONARY_TYPE) \
68 V(PROTOTYPE_USERS_TYPE) \
69 V(REGEXP_MULTIPLE_CACHE_TYPE) \
70 V(RELOC_INFO_TYPE) \
71 V(RETAINED_MAPS_TYPE) \
72 V(SCRIPT_LIST_TYPE) \
73 V(SCRIPT_INFOS_TYPE) \
74 V(SCRIPT_SOURCE_EXTERNAL_ONE_BYTE_TYPE) \
75 V(SCRIPT_SOURCE_EXTERNAL_TWO_BYTE_TYPE) \
76 V(SCRIPT_SOURCE_NON_EXTERNAL_ONE_BYTE_TYPE) \
77 V(SCRIPT_SOURCE_NON_EXTERNAL_TWO_BYTE_TYPE) \
78 V(SERIALIZED_OBJECTS_TYPE) \
79 V(SINGLE_CHARACTER_STRING_TABLE_TYPE) \
80 V(STRING_SPLIT_CACHE_TYPE) \
81 V(STRING_EXTERNAL_RESOURCE_ONE_BYTE_TYPE) \
82 V(STRING_EXTERNAL_RESOURCE_TWO_BYTE_TYPE) \
83 V(SOURCE_POSITION_TABLE_TYPE) \
84 V(UNCOMPILED_SHARED_FUNCTION_INFO_TYPE) \
85 V(WASTED_DESCRIPTOR_ARRAY_DETAILS_TYPE) \
86 V(WASTED_DESCRIPTOR_ARRAY_VALUES_TYPE) \
87 V(WEAK_NEW_SPACE_OBJECT_TO_CODE_TYPE)
88
89namespace v8 {
90namespace internal {
91
92class Heap;
93class Isolate;
94
96 public:
97 static const size_t kNoOverAllocation = 0;
98
100
101 // See description on VIRTUAL_INSTANCE_TYPE_LIST.
103#define DEFINE_VIRTUAL_INSTANCE_TYPE(type) type,
105#undef DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE
106 LAST_VIRTUAL_TYPE = WEAK_NEW_SPACE_OBJECT_TO_CODE_TYPE,
107 };
108
109 // ObjectStats are kept in two arrays, counts and sizes. Related stats are
110 // stored in a contiguous linear buffer. Stats groups are stored one after
111 // another.
112 static constexpr int FIRST_VIRTUAL_TYPE = LAST_TYPE + 1;
113 static constexpr int OBJECT_STATS_COUNT =
115 static_cast<int>(VirtualInstanceType::LAST_VIRTUAL_TYPE) + 1;
116
117 void ClearObjectStats(bool clear_last_time_stats = false);
118
119 void PrintJSON(const char* key);
120 void Dump(std::stringstream& stream);
121
123 void RecordObjectStats(InstanceType type, size_t size,
124 size_t over_allocated = kNoOverAllocation);
125 void RecordVirtualObjectStats(VirtualInstanceType type, size_t size,
126 size_t over_allocated);
127
128 size_t object_count_last_gc(size_t index) {
130 }
131
132 size_t object_size_last_gc(size_t index) {
134 }
135
136 Isolate* isolate();
137 Heap* heap() { return heap_; }
138
139 private:
140 static const int kFirstBucketShift = 5; // <32
141 static const int kLastBucketShift = 20; // >=1M
142 static const int kFirstBucket = 1 << kFirstBucketShift;
143 static const int kLastBucket = 1 << kLastBucketShift;
146
147 void PrintKeyAndId(const char* key, int gc_count);
148 // The following functions are excluded from inline to reduce the overall
149 // binary size of VB. On x64 this save around 80KB.
150 V8_NOINLINE void PrintInstanceTypeJSON(const char* key, int gc_count,
151 const char* name, int index);
152 V8_NOINLINE void DumpInstanceTypeData(std::stringstream& stream,
153 const char* name, int index);
154
155 int HistogramIndexFromSize(size_t size);
156
158 // Object counts and used memory by InstanceType.
163 // Approximation of overallocated memory by InstanceType.
165 // Detailed histograms by InstanceType.
168
175
177};
178
180 public:
187
188 // Collects type information of live and dead objects. Requires mark bits to
189 // be present.
190 void Collect();
191
192 private:
193 Heap* const heap_;
196};
197
198} // namespace internal
199} // namespace v8
200
201#endif // V8_HEAP_OBJECT_STATS_H_
ObjectStatsCollector(Heap *heap, ObjectStats *live, ObjectStats *dead)
static constexpr int OBJECT_STATS_COUNT
static const int kNumberOfBuckets
size_t object_sizes_last_time_[OBJECT_STATS_COUNT]
size_t over_allocated_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets]
size_t object_counts_last_time_[OBJECT_STATS_COUNT]
V8_NOINLINE void DumpInstanceTypeData(std::stringstream &stream, const char *name, int index)
void RecordVirtualObjectStats(VirtualInstanceType type, size_t size, size_t over_allocated)
size_t over_allocated_[OBJECT_STATS_COUNT]
int HistogramIndexFromSize(size_t size)
void PrintKeyAndId(const char *key, int gc_count)
void PrintJSON(const char *key)
void Dump(std::stringstream &stream)
static const int kLastBucket
size_t object_count_last_gc(size_t index)
void RecordObjectStats(InstanceType type, size_t size, size_t over_allocated=kNoOverAllocation)
size_t object_size_last_gc(size_t index)
static const int kFirstBucketShift
size_t size_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets]
static const int kLastBucketShift
V8_NOINLINE void PrintInstanceTypeJSON(const char *key, int gc_count, const char *name, int index)
size_t object_sizes_[OBJECT_STATS_COUNT]
static const int kLastValueBucketIndex
size_t object_counts_[OBJECT_STATS_COUNT]
void ClearObjectStats(bool clear_last_time_stats=false)
static const size_t kNoOverAllocation
static const int kFirstBucket
static constexpr int FIRST_VIRTUAL_TYPE
#define VIRTUAL_INSTANCE_TYPE_LIST(V)
#define DCHECK_NOT_NULL(val)
Definition logging.h:492
#define V8_NOINLINE
Definition v8config.h:586