summaryrefslogtreecommitdiff
path: root/deps/v8/src/heap/object-stats.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/heap/object-stats.cc')
-rw-r--r--deps/v8/src/heap/object-stats.cc63
1 files changed, 57 insertions, 6 deletions
diff --git a/deps/v8/src/heap/object-stats.cc b/deps/v8/src/heap/object-stats.cc
index 2a63896242..2ee88361c9 100644
--- a/deps/v8/src/heap/object-stats.cc
+++ b/deps/v8/src/heap/object-stats.cc
@@ -35,11 +35,16 @@ class FieldStatsCollector : public ObjectVisitor {
public:
FieldStatsCollector(size_t* tagged_fields_count,
size_t* embedder_fields_count,
+ size_t* inobject_smi_fields_count,
size_t* unboxed_double_fields_count,
- size_t* raw_fields_count)
+ size_t* boxed_double_fields_count,
+ size_t* string_data_count, size_t* raw_fields_count)
: tagged_fields_count_(tagged_fields_count),
embedder_fields_count_(embedder_fields_count),
+ inobject_smi_fields_count_(inobject_smi_fields_count),
unboxed_double_fields_count_(unboxed_double_fields_count),
+ boxed_double_fields_count_(boxed_double_fields_count),
+ string_data_count_(string_data_count),
raw_fields_count_(raw_fields_count) {}
void RecordStats(HeapObject host) {
@@ -62,11 +67,32 @@ class FieldStatsCollector : public ObjectVisitor {
*tagged_fields_count_ -= field_stats.embedded_fields_count_;
*embedder_fields_count_ += field_stats.embedded_fields_count_;
+ // Smi fields are also included into pointer words.
+ DCHECK_LE(
+ field_stats.unboxed_double_fields_count_ * kDoubleSize / kTaggedSize,
+ raw_fields_count_in_object);
+ tagged_fields_count_in_object -= field_stats.smi_fields_count_;
+ *tagged_fields_count_ -= field_stats.smi_fields_count_;
+ *inobject_smi_fields_count_ += field_stats.smi_fields_count_;
+
// The rest are data words.
- DCHECK_LE(field_stats.unboxed_double_fields_count_,
- raw_fields_count_in_object);
- raw_fields_count_in_object -= field_stats.unboxed_double_fields_count_;
+ DCHECK_LE(
+ field_stats.unboxed_double_fields_count_ * kDoubleSize / kTaggedSize,
+ raw_fields_count_in_object);
+ raw_fields_count_in_object -=
+ field_stats.unboxed_double_fields_count_ * kDoubleSize / kTaggedSize;
*unboxed_double_fields_count_ += field_stats.unboxed_double_fields_count_;
+ } else if (host.IsHeapNumber()) {
+ DCHECK_LE(kDoubleSize / kTaggedSize, raw_fields_count_in_object);
+ raw_fields_count_in_object -= kDoubleSize / kTaggedSize;
+ *boxed_double_fields_count_ += 1;
+ } else if (host.IsSeqString()) {
+ int string_data = SeqString::cast(host).synchronized_length() *
+ (String::cast(host).IsOneByteRepresentation() ? 1 : 2) /
+ kTaggedSize;
+ DCHECK_LE(string_data, raw_fields_count_in_object);
+ raw_fields_count_in_object -= string_data;
+ *string_data_count_ += string_data;
}
*raw_fields_count_ += raw_fields_count_in_object;
}
@@ -92,9 +118,12 @@ class FieldStatsCollector : public ObjectVisitor {
private:
struct JSObjectFieldStats {
JSObjectFieldStats()
- : embedded_fields_count_(0), unboxed_double_fields_count_(0) {}
+ : embedded_fields_count_(0),
+ smi_fields_count_(0),
+ unboxed_double_fields_count_(0) {}
unsigned embedded_fields_count_ : kDescriptorIndexBitCount;
+ unsigned smi_fields_count_ : kDescriptorIndexBitCount;
unsigned unboxed_double_fields_count_ : kDescriptorIndexBitCount;
};
std::unordered_map<Map, JSObjectFieldStats, Object::Hasher>
@@ -104,7 +133,10 @@ class FieldStatsCollector : public ObjectVisitor {
size_t* const tagged_fields_count_;
size_t* const embedder_fields_count_;
+ size_t* const inobject_smi_fields_count_;
size_t* const unboxed_double_fields_count_;
+ size_t* const boxed_double_fields_count_;
+ size_t* const string_data_count_;
size_t* const raw_fields_count_;
};
@@ -130,6 +162,9 @@ FieldStatsCollector::GetInobjectFieldStats(Map map) {
map.IsUnboxedDoubleField(index)) {
++stats.unboxed_double_fields_count_;
}
+ if (details.representation().IsSmi()) {
+ ++stats.smi_fields_count_;
+ }
}
}
}
@@ -149,7 +184,10 @@ void ObjectStats::ClearObjectStats(bool clear_last_time_stats) {
}
tagged_fields_count_ = 0;
embedder_fields_count_ = 0;
+ inobject_smi_fields_count_ = 0;
unboxed_double_fields_count_ = 0;
+ boxed_double_fields_count_ = 0;
+ string_data_count_ = 0;
raw_fields_count_ = 0;
}
@@ -208,8 +246,13 @@ void ObjectStats::PrintJSON(const char* key) {
PrintF(", \"tagged_fields\": %zu", tagged_fields_count_ * kTaggedSize);
PrintF(", \"embedder_fields\": %zu",
embedder_fields_count_ * kEmbedderDataSlotSize);
+ PrintF(", \"inobject_smi_fields\": %zu",
+ inobject_smi_fields_count_ * kTaggedSize);
PrintF(", \"unboxed_double_fields\": %zu",
unboxed_double_fields_count_ * kDoubleSize);
+ PrintF(", \"boxed_double_fields\": %zu",
+ boxed_double_fields_count_ * kDoubleSize);
+ PrintF(", \"string_data\": %zu", string_data_count_ * kTaggedSize);
PrintF(", \"other_raw_fields\": %zu", raw_fields_count_ * kSystemPointerSize);
PrintF(" }\n");
// bucket_sizes
@@ -263,8 +306,13 @@ void ObjectStats::Dump(std::stringstream& stream) {
stream << "\"tagged_fields\":" << (tagged_fields_count_ * kTaggedSize);
stream << ",\"embedder_fields\":"
<< (embedder_fields_count_ * kEmbedderDataSlotSize);
+ stream << ",\"inobject_smi_fields\": "
+ << (inobject_smi_fields_count_ * kTaggedSize);
stream << ",\"unboxed_double_fields\": "
<< (unboxed_double_fields_count_ * kDoubleSize);
+ stream << ",\"boxed_double_fields\": "
+ << (boxed_double_fields_count_ * kDoubleSize);
+ stream << ",\"string_data\": " << (string_data_count_ * kTaggedSize);
stream << ",\"other_raw_fields\":"
<< (raw_fields_count_ * kSystemPointerSize);
stream << "}, ";
@@ -427,7 +475,10 @@ ObjectStatsCollectorImpl::ObjectStatsCollectorImpl(Heap* heap,
heap->mark_compact_collector()->non_atomic_marking_state()),
field_stats_collector_(
&stats->tagged_fields_count_, &stats->embedder_fields_count_,
- &stats->unboxed_double_fields_count_, &stats->raw_fields_count_) {}
+ &stats->inobject_smi_fields_count_,
+ &stats->unboxed_double_fields_count_,
+ &stats->boxed_double_fields_count_, &stats->string_data_count_,
+ &stats->raw_fields_count_) {}
bool ObjectStatsCollectorImpl::ShouldRecordObject(HeapObject obj,
CowMode check_cow_array) {