Index: src/heap/object-stats.h |
diff --git a/src/heap/object-stats.h b/src/heap/object-stats.h |
index ce0a317cf1bf83ac8190efa5288f1229ae3770f6..2448141da126d490a14112f54d34499ccbc9dfcb 100644 |
--- a/src/heap/object-stats.h |
+++ b/src/heap/object-stats.h |
@@ -14,7 +14,7 @@ namespace internal { |
class ObjectStats { |
public: |
- explicit ObjectStats(Heap* heap) : heap_(heap) {} |
+ explicit ObjectStats(Heap* heap) : heap_(heap) { ClearObjectStats(); } |
// ObjectStats are kept in two arrays, counts and sizes. Related stats are |
// stored in a contiguous linear buffer. Stats groups are stored one after |
@@ -30,14 +30,14 @@ class ObjectStats { |
void ClearObjectStats(bool clear_last_time_stats = false); |
- void TraceObjectStats(); |
- void TraceObjectStat(const char* name, int count, int size, double time); |
void CheckpointObjectStats(); |
+ void PrintJSON(const char* key); |
void RecordObjectStats(InstanceType type, size_t size) { |
DCHECK(type <= LAST_TYPE); |
object_counts_[type]++; |
object_sizes_[type] += size; |
+ size_histogram_[type][HistogramIndexFromSize(size)]++; |
} |
void RecordCodeSubTypeStats(int code_sub_type, int code_age, size_t size) { |
@@ -52,12 +52,22 @@ class ObjectStats { |
object_sizes_[code_sub_type_index] += size; |
object_counts_[code_age_index]++; |
object_sizes_[code_age_index] += size; |
+ const int idx = HistogramIndexFromSize(size); |
+ size_histogram_[code_sub_type_index][idx]++; |
+ size_histogram_[code_age_index][idx]++; |
} |
- void RecordFixedArraySubTypeStats(int array_sub_type, size_t size) { |
+ void RecordFixedArraySubTypeStats(int array_sub_type, size_t size, |
+ size_t over_allocated) { |
DCHECK(array_sub_type <= LAST_FIXED_ARRAY_SUB_TYPE); |
object_counts_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type]++; |
object_sizes_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] += size; |
+ size_histogram_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] |
+ [HistogramIndexFromSize(size)]++; |
+ over_allocated_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] += |
+ over_allocated; |
+ over_allocated_histogram_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] |
+ [HistogramIndexFromSize(over_allocated)]++; |
} |
size_t object_count_last_gc(size_t index) { |
@@ -72,46 +82,49 @@ class ObjectStats { |
Heap* heap() { return heap_; } |
private: |
- Heap* heap_; |
+ static const int kFirstBucketShift = 5; // <=32 |
+ static const int kLastBucketShift = 19; // >512k |
+ static const int kFirstBucket = 1 << kFirstBucketShift; |
+ static const int kLastBucket = 1 << kLastBucketShift; |
+ static const int kNumberOfBuckets = kLastBucketShift - kFirstBucketShift; |
+ |
+ int HistogramIndexFromSize(size_t size) { |
+ if (size == 0) return 0; |
+ int idx = |
+ static_cast<int>(log2(static_cast<double>(size))) - kFirstBucketShift; |
+ return idx < 0 ? 0 : idx; |
+ } |
- // Object counts and used memory by InstanceType |
+ Heap* heap_; |
+ // Object counts and used memory by InstanceType. |
size_t object_counts_[OBJECT_STATS_COUNT]; |
size_t object_counts_last_time_[OBJECT_STATS_COUNT]; |
size_t object_sizes_[OBJECT_STATS_COUNT]; |
size_t object_sizes_last_time_[OBJECT_STATS_COUNT]; |
+ // Approximation of overallocated memory by InstanceType. |
+ size_t over_allocated_[OBJECT_STATS_COUNT]; |
+ // Detailed histograms by InstanceType. |
+ size_t size_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets]; |
+ size_t over_allocated_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets]; |
}; |
class ObjectStatsCollector { |
public: |
- static void CollectStatistics(StaticVisitorBase::VisitorId id, Map* map, |
- HeapObject* obj); |
- static void CollectFixedArrayStatistics(HeapObject* obj); |
- |
- static void CountFixedArray(FixedArrayBase* fixed_array, |
- FixedArraySubInstanceType fast_type, |
- FixedArraySubInstanceType dictionary_type); |
- static void RecordMapStats(Map* map, HeapObject* obj); |
- static void RecordCodeStats(Map* map, HeapObject* obj); |
- static void RecordSharedFunctionInfoStats(Map* map, HeapObject* obj); |
- static void RecordFixedArrayStats(Map* map, HeapObject* obj); |
-}; |
- |
-class MarkCompactObjectStatsVisitor |
- : public StaticMarkingVisitor<MarkCompactObjectStatsVisitor> { |
- public: |
- static void Initialize(VisitorDispatchTable<Callback>* original); |
+ static void CollectStatistics(ObjectStats* stats, HeapObject* obj); |
- template <VisitorId id> |
- static inline void Visit(Map* map, HeapObject* obj); |
-}; |
- |
-class IncrementalMarkingObjectStatsVisitor |
- : public StaticMarkingVisitor<IncrementalMarkingObjectStatsVisitor> { |
- public: |
- static void Initialize(VisitorDispatchTable<Callback>* original); |
- |
- template <VisitorId id> |
- static inline void Visit(Map* map, HeapObject* obj); |
+ private: |
+ static void RecordMapDetails(ObjectStats* stats, Heap* heap, HeapObject* obj); |
+ static void RecordCodeDetails(ObjectStats* stats, Heap* heap, |
+ HeapObject* obj); |
+ static void RecordSharedFunctionInfoDetails(ObjectStats* stats, Heap* heap, |
+ HeapObject* obj); |
+ static void RecordFixedArrayDetails(ObjectStats* stats, Heap* heap, |
+ HeapObject* obj); |
+ |
+ static void RecordJSObjectDetails(ObjectStats* stats, Heap* heap, |
+ JSObject* object); |
+ static void RecordJSWeakCollectionDetails(ObjectStats* stats, Heap* heap, |
+ JSWeakCollection* obj); |
}; |
} // namespace internal |