| Index: src/heap/heap.h
 | 
| diff --git a/src/heap/heap.h b/src/heap/heap.h
 | 
| index 32be7698867c17d81cb943578cc35693b943f356..933c4dc4dc4c9480297a1e4cb5c05a0e599b8ef1 100644
 | 
| --- a/src/heap/heap.h
 | 
| +++ b/src/heap/heap.h
 | 
| @@ -424,6 +424,7 @@ class HeapObjectsFilter;
 | 
|  class HeapStats;
 | 
|  class Isolate;
 | 
|  class MemoryReducer;
 | 
| +class ObjectStats;
 | 
|  class WeakObjectRetainer;
 | 
|  
 | 
|  
 | 
| @@ -586,18 +587,6 @@ class Heap {
 | 
|  
 | 
|    enum HeapState { NOT_IN_GC, SCAVENGE, MARK_COMPACT };
 | 
|  
 | 
| -  // ObjectStats are kept in two arrays, counts and sizes. Related stats are
 | 
| -  // stored in a contiguous linear buffer. Stats groups are stored one after
 | 
| -  // another.
 | 
| -  enum {
 | 
| -    FIRST_CODE_KIND_SUB_TYPE = LAST_TYPE + 1,
 | 
| -    FIRST_FIXED_ARRAY_SUB_TYPE =
 | 
| -        FIRST_CODE_KIND_SUB_TYPE + Code::NUMBER_OF_KINDS,
 | 
| -    FIRST_CODE_AGE_SUB_TYPE =
 | 
| -        FIRST_FIXED_ARRAY_SUB_TYPE + LAST_FIXED_ARRAY_SUB_TYPE + 1,
 | 
| -    OBJECT_STATS_COUNT = FIRST_CODE_AGE_SUB_TYPE + Code::kCodeAgeCount + 1
 | 
| -  };
 | 
| -
 | 
|    // Taking this lock prevents the GC from entering a phase that relocates
 | 
|    // object references.
 | 
|    class RelocationLock {
 | 
| @@ -909,14 +898,6 @@ class Heap {
 | 
|    // Print short heap statistics.
 | 
|    void PrintShortHeapStatistics();
 | 
|  
 | 
| -  size_t object_count_last_gc(size_t index) {
 | 
| -    return index < OBJECT_STATS_COUNT ? object_counts_last_time_[index] : 0;
 | 
| -  }
 | 
| -
 | 
| -  size_t object_size_last_gc(size_t index) {
 | 
| -    return index < OBJECT_STATS_COUNT ? object_sizes_last_time_[index] : 0;
 | 
| -  }
 | 
| -
 | 
|    inline HeapState gc_state() { return gc_state_; }
 | 
|  
 | 
|    inline bool IsInGCPostProcessing() { return gc_post_processing_depth_ > 0; }
 | 
| @@ -1009,38 +990,6 @@ class Heap {
 | 
|      return new_space_.IsAtMaximumCapacity() && maximum_size_scavenges_ == 0;
 | 
|    }
 | 
|  
 | 
| -  void RecordObjectStats(InstanceType type, size_t size) {
 | 
| -    DCHECK(type <= LAST_TYPE);
 | 
| -    object_counts_[type]++;
 | 
| -    object_sizes_[type] += size;
 | 
| -  }
 | 
| -
 | 
| -  void RecordCodeSubTypeStats(int code_sub_type, int code_age, size_t size) {
 | 
| -    int code_sub_type_index = FIRST_CODE_KIND_SUB_TYPE + code_sub_type;
 | 
| -    int code_age_index =
 | 
| -        FIRST_CODE_AGE_SUB_TYPE + code_age - Code::kFirstCodeAge;
 | 
| -    DCHECK(code_sub_type_index >= FIRST_CODE_KIND_SUB_TYPE &&
 | 
| -           code_sub_type_index < FIRST_CODE_AGE_SUB_TYPE);
 | 
| -    DCHECK(code_age_index >= FIRST_CODE_AGE_SUB_TYPE &&
 | 
| -           code_age_index < OBJECT_STATS_COUNT);
 | 
| -    object_counts_[code_sub_type_index]++;
 | 
| -    object_sizes_[code_sub_type_index] += size;
 | 
| -    object_counts_[code_age_index]++;
 | 
| -    object_sizes_[code_age_index] += size;
 | 
| -  }
 | 
| -
 | 
| -  void RecordFixedArraySubTypeStats(int array_sub_type, size_t size) {
 | 
| -    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;
 | 
| -  }
 | 
| -
 | 
| -  void TraceObjectStats();
 | 
| -  void TraceObjectStat(const char* name, int count, int size, double time);
 | 
| -  void CheckpointObjectStats();
 | 
| -  bool GetObjectTypeName(size_t index, const char** object_type,
 | 
| -                         const char** object_sub_type);
 | 
| -
 | 
|    void AddWeakObjectToCodeDependency(Handle<HeapObject> obj,
 | 
|                                       Handle<DependentCode> dep);
 | 
|  
 | 
| @@ -1384,6 +1333,25 @@ class Heap {
 | 
|    bool InSpace(HeapObject* value, AllocationSpace space);
 | 
|  
 | 
|    // ===========================================================================
 | 
| +  // Object statistics tracking. ===============================================
 | 
| +  // ===========================================================================
 | 
| +
 | 
| +  // Returns the number of buckets used by object statistics tracking during a
 | 
| +  // major GC. Note that the following methods fail gracefully when the bounds
 | 
| +  // are exceeded though.
 | 
| +  size_t NumberOfTrackedHeapObjectTypes();
 | 
| +
 | 
| +  // Returns object statistics about count and size at the last major GC.
 | 
| +  // Objects are being grouped into buckets that roughly resemble existing
 | 
| +  // instance types.
 | 
| +  size_t ObjectCountAtLastGC(size_t index);
 | 
| +  size_t ObjectSizeAtLastGC(size_t index);
 | 
| +
 | 
| +  // Retrieves names of buckets used by object statistics tracking.
 | 
| +  bool GetObjectTypeName(size_t index, const char** object_type,
 | 
| +                         const char** object_sub_type);
 | 
| +
 | 
| +  // ===========================================================================
 | 
|    // GC statistics. ============================================================
 | 
|    // ===========================================================================
 | 
|  
 | 
| @@ -1840,8 +1808,6 @@ class Heap {
 | 
|    void CheckAndNotifyBackgroundIdleNotification(double idle_time_in_ms,
 | 
|                                                  double now_ms);
 | 
|  
 | 
| -  void ClearObjectStats(bool clear_last_time_stats = false);
 | 
| -
 | 
|    inline void UpdateAllocationsHash(HeapObject* object);
 | 
|    inline void UpdateAllocationsHash(uint32_t value);
 | 
|    void PrintAlloctionsHash();
 | 
| @@ -2274,12 +2240,6 @@ class Heap {
 | 
|    // of the allocation site.
 | 
|    unsigned int maximum_size_scavenges_;
 | 
|  
 | 
| -  // 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];
 | 
| -
 | 
|    // Maximum GC pause.
 | 
|    double max_gc_pause_;
 | 
|  
 | 
| @@ -2314,6 +2274,8 @@ class Heap {
 | 
|  
 | 
|    MemoryReducer* memory_reducer_;
 | 
|  
 | 
| +  ObjectStats* object_stats_;
 | 
| +
 | 
|    // These two counters are monotomically increasing and never reset.
 | 
|    size_t full_codegen_bytes_generated_;
 | 
|    size_t crankshaft_codegen_bytes_generated_;
 | 
| 
 |