LCOV - code coverage report
Current view: top level - src/heap - object-stats.h (source / functions) Hit Total Coverage
Test: app.info Lines: 0 4 0.0 %
Date: 2019-04-19 Functions: 0 0 -

          Line data    Source code
       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.h"
       9             : #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 Code and FixedArray sub types
      13             : // 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(NOSCRIPT_SHARED_FUNCTION_INFOS_TYPE)         \
      58             :   V(NUMBER_STRING_CACHE_TYPE)                    \
      59             :   V(OBJECT_DICTIONARY_ELEMENTS_TYPE)             \
      60             :   V(OBJECT_ELEMENTS_TYPE)                        \
      61             :   V(OBJECT_PROPERTY_ARRAY_TYPE)                  \
      62             :   V(OBJECT_PROPERTY_DICTIONARY_TYPE)             \
      63             :   V(OBJECT_TO_CODE_TYPE)                         \
      64             :   V(OPTIMIZED_CODE_LITERALS_TYPE)                \
      65             :   V(OTHER_CONTEXT_TYPE)                          \
      66             :   V(PROTOTYPE_DESCRIPTOR_ARRAY_TYPE)             \
      67             :   V(PROTOTYPE_PROPERTY_ARRAY_TYPE)               \
      68             :   V(PROTOTYPE_PROPERTY_DICTIONARY_TYPE)          \
      69             :   V(PROTOTYPE_USERS_TYPE)                        \
      70             :   V(REGEXP_MULTIPLE_CACHE_TYPE)                  \
      71             :   V(RELOC_INFO_TYPE)                             \
      72             :   V(RETAINED_MAPS_TYPE)                          \
      73             :   V(SCRIPT_LIST_TYPE)                            \
      74             :   V(SCRIPT_SHARED_FUNCTION_INFOS_TYPE)           \
      75             :   V(SCRIPT_SOURCE_EXTERNAL_ONE_BYTE_TYPE)        \
      76             :   V(SCRIPT_SOURCE_EXTERNAL_TWO_BYTE_TYPE)        \
      77             :   V(SCRIPT_SOURCE_NON_EXTERNAL_ONE_BYTE_TYPE)    \
      78             :   V(SCRIPT_SOURCE_NON_EXTERNAL_TWO_BYTE_TYPE)    \
      79             :   V(SERIALIZED_OBJECTS_TYPE)                     \
      80             :   V(SINGLE_CHARACTER_STRING_CACHE_TYPE)          \
      81             :   V(STRING_SPLIT_CACHE_TYPE)                     \
      82             :   V(STRING_EXTERNAL_RESOURCE_ONE_BYTE_TYPE)      \
      83             :   V(STRING_EXTERNAL_RESOURCE_TWO_BYTE_TYPE)      \
      84             :   V(SOURCE_POSITION_TABLE_TYPE)                  \
      85             :   V(UNCOMPILED_SHARED_FUNCTION_INFO_TYPE)        \
      86             :   V(WEAK_NEW_SPACE_OBJECT_TO_CODE_TYPE)
      87             : 
      88             : namespace v8 {
      89             : namespace internal {
      90             : 
      91             : class Heap;
      92             : class Isolate;
      93             : 
      94             : class ObjectStats {
      95             :  public:
      96             :   static const size_t kNoOverAllocation = 0;
      97             : 
      98           0 :   explicit ObjectStats(Heap* heap) : heap_(heap) { ClearObjectStats(); }
      99             : 
     100             :   // See description on VIRTUAL_INSTANCE_TYPE_LIST.
     101             :   enum VirtualInstanceType {
     102             : #define DEFINE_VIRTUAL_INSTANCE_TYPE(type) type,
     103             :     VIRTUAL_INSTANCE_TYPE_LIST(DEFINE_VIRTUAL_INSTANCE_TYPE)
     104             : #undef DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE
     105             :         LAST_VIRTUAL_TYPE = WEAK_NEW_SPACE_OBJECT_TO_CODE_TYPE,
     106             :   };
     107             : 
     108             :   // ObjectStats are kept in two arrays, counts and sizes. Related stats are
     109             :   // stored in a contiguous linear buffer. Stats groups are stored one after
     110             :   // another.
     111             :   enum {
     112             :     FIRST_VIRTUAL_TYPE = LAST_TYPE + 1,
     113             :     OBJECT_STATS_COUNT = FIRST_VIRTUAL_TYPE + LAST_VIRTUAL_TYPE + 1,
     114             :   };
     115             : 
     116             :   void ClearObjectStats(bool clear_last_time_stats = false);
     117             : 
     118             :   void PrintJSON(const char* key);
     119             :   void Dump(std::stringstream& stream);
     120             : 
     121             :   void CheckpointObjectStats();
     122             :   void RecordObjectStats(InstanceType type, size_t size,
     123             :                          size_t over_allocated = kNoOverAllocation);
     124             :   void RecordVirtualObjectStats(VirtualInstanceType type, size_t size,
     125             :                                 size_t over_allocated);
     126             : 
     127             :   size_t object_count_last_gc(size_t index) {
     128           0 :     return object_counts_last_time_[index];
     129             :   }
     130             : 
     131             :   size_t object_size_last_gc(size_t index) {
     132           0 :     return object_sizes_last_time_[index];
     133             :   }
     134             : 
     135             :   Isolate* isolate();
     136             :   Heap* heap() { return heap_; }
     137             : 
     138             :  private:
     139             :   static const int kFirstBucketShift = 5;  // <32
     140             :   static const int kLastBucketShift = 20;  // >=1M
     141             :   static const int kFirstBucket = 1 << kFirstBucketShift;
     142             :   static const int kLastBucket = 1 << kLastBucketShift;
     143             :   static const int kNumberOfBuckets = kLastBucketShift - kFirstBucketShift + 1;
     144             :   static const int kLastValueBucketIndex = kLastBucketShift - kFirstBucketShift;
     145             : 
     146             :   void PrintKeyAndId(const char* key, int gc_count);
     147             :   // The following functions are excluded from inline to reduce the overall
     148             :   // binary size of VB. On x64 this save around 80KB.
     149             :   V8_NOINLINE void PrintInstanceTypeJSON(const char* key, int gc_count,
     150             :                                          const char* name, int index);
     151             :   V8_NOINLINE void DumpInstanceTypeData(std::stringstream& stream,
     152             :                                         const char* name, int index);
     153             : 
     154             :   int HistogramIndexFromSize(size_t size);
     155             : 
     156             :   Heap* heap_;
     157             :   // Object counts and used memory by InstanceType.
     158             :   size_t object_counts_[OBJECT_STATS_COUNT];
     159             :   size_t object_counts_last_time_[OBJECT_STATS_COUNT];
     160             :   size_t object_sizes_[OBJECT_STATS_COUNT];
     161             :   size_t object_sizes_last_time_[OBJECT_STATS_COUNT];
     162             :   // Approximation of overallocated memory by InstanceType.
     163             :   size_t over_allocated_[OBJECT_STATS_COUNT];
     164             :   // Detailed histograms by InstanceType.
     165             :   size_t size_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets];
     166             :   size_t over_allocated_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets];
     167             : 
     168             :   size_t tagged_fields_count_;
     169             :   size_t embedder_fields_count_;
     170             :   size_t unboxed_double_fields_count_;
     171             :   size_t raw_fields_count_;
     172             : 
     173             :   friend class ObjectStatsCollectorImpl;
     174             : };
     175             : 
     176             : class ObjectStatsCollector {
     177             :  public:
     178             :   ObjectStatsCollector(Heap* heap, ObjectStats* live, ObjectStats* dead)
     179           0 :       : heap_(heap), live_(live), dead_(dead) {
     180             :     DCHECK_NOT_NULL(heap_);
     181             :     DCHECK_NOT_NULL(live_);
     182             :     DCHECK_NOT_NULL(dead_);
     183             :   }
     184             : 
     185             :   // Collects type information of live and dead objects. Requires mark bits to
     186             :   // be present.
     187             :   void Collect();
     188             : 
     189             :  private:
     190             :   Heap* const heap_;
     191             :   ObjectStats* const live_;
     192             :   ObjectStats* const dead_;
     193             : };
     194             : 
     195             : }  // namespace internal
     196             : }  // namespace v8
     197             : 
     198             : #endif  // V8_HEAP_OBJECT_STATS_H_

Generated by: LCOV version 1.10