1 // Copyright 2021 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 INCLUDE_CPPGC_HEAP_STATISTICS_H_
6 #define INCLUDE_CPPGC_HEAP_STATISTICS_H_
7 
8 #include <cstddef>
9 #include <cstdint>
10 #include <string>
11 #include <vector>
12 
13 namespace cppgc {
14 
15 /**
16  * `HeapStatistics` contains memory consumption and utilization statistics for a
17  * cppgc heap.
18  */
19 struct HeapStatistics final {
20   /**
21    * Specifies the detail level of the heap statistics. Brief statistics contain
22    * only the top-level allocated and used memory statistics for the entire
23    * heap. Detailed statistics also contain a break down per space and page, as
24    * well as freelist statistics and object type histograms. Note that used
25    * memory reported by brief statistics and detailed statistics might differ
26    * slightly.
27    */
28   enum DetailLevel : uint8_t {
29     kBrief,
30     kDetailed,
31   };
32 
33   /**
34    * Object statistics for a single type.
35    */
36   struct ObjectStatsEntry {
37     /**
38      * Number of allocated bytes.
39      */
40     size_t allocated_bytes;
41     /**
42      * Number of allocated objects.
43      */
44     size_t object_count;
45   };
46 
47   /**
48    * Page granularity statistics. For each page the statistics record the
49    * allocated memory size and overall used memory size for the page.
50    */
51   struct PageStatistics {
52     /** Overall committed amount of memory for the page. */
53     size_t committed_size_bytes = 0;
54     /** Resident amount of memory held by the page. */
55     size_t resident_size_bytes = 0;
56     /** Amount of memory actually used on the page. */
57     size_t used_size_bytes = 0;
58     /** Statistics for object allocated on the page. Filled only when
59      * NameProvider::HideInternalNames() is false. */
60     std::vector<ObjectStatsEntry> object_statistics;
61   };
62 
63   /**
64    * Statistics of the freelist (used only in non-large object spaces). For
65    * each bucket in the freelist the statistics record the bucket size, the
66    * number of freelist entries in the bucket, and the overall allocated memory
67    * consumed by these freelist entries.
68    */
69   struct FreeListStatistics {
70     /** bucket sizes in the freelist. */
71     std::vector<size_t> bucket_size;
72     /** number of freelist entries per bucket. */
73     std::vector<size_t> free_count;
74     /** memory size consumed by freelist entries per size. */
75     std::vector<size_t> free_size;
76   };
77 
78   /**
79    * Space granularity statistics. For each space the statistics record the
80    * space name, the amount of allocated memory and overall used memory for the
81    * space. The statistics also contain statistics for each of the space's
82    * pages, its freelist and the objects allocated on the space.
83    */
84   struct SpaceStatistics {
85     /** The space name */
86     std::string name;
87     /** Overall committed amount of memory for the heap. */
88     size_t committed_size_bytes = 0;
89     /** Resident amount of memory held by the heap. */
90     size_t resident_size_bytes = 0;
91     /** Amount of memory actually used on the space. */
92     size_t used_size_bytes = 0;
93     /** Statistics for each of the pages in the space. */
94     std::vector<PageStatistics> page_stats;
95     /** Statistics for the freelist of the space. */
96     FreeListStatistics free_list_stats;
97   };
98 
99   /** Overall committed amount of memory for the heap. */
100   size_t committed_size_bytes = 0;
101   /** Resident amount of memory help by the heap. */
102   size_t resident_size_bytes = 0;
103   /** Amount of memory actually used on the heap. */
104   size_t used_size_bytes = 0;
105   /** Detail level of this HeapStatistics. */
106   DetailLevel detail_level;
107 
108   /** Statistics for each of the spaces in the heap. Filled only when
109    * `detail_level` is `DetailLevel::kDetailed`. */
110   std::vector<SpaceStatistics> space_stats;
111 
112   /**
113    * Vector of `cppgc::GarbageCollected` type names.
114    */
115   std::vector<std::string> type_names;
116 };
117 
118 }  // namespace cppgc
119 
120 #endif  // INCLUDE_CPPGC_HEAP_STATISTICS_H_
121