8#include <unordered_map>
25std::string GetNormalPageSpaceName(
size_t index) {
30 return "NormalPageSpace" + std::to_string(index);
33 return "CustomSpace" +
37HeapStatistics::SpaceStatistics* InitializeSpace(HeapStatistics* stats,
39 stats->space_stats.emplace_back();
40 HeapStatistics::SpaceStatistics* space_stats = &stats->space_stats.back();
41 space_stats->name = std::move(name);
45HeapStatistics::PageStatistics* InitializePage(
46 HeapStatistics::SpaceStatistics* stats) {
47 stats->page_stats.emplace_back();
48 HeapStatistics::PageStatistics* page_stats = &stats->page_stats.back();
52void FinalizePage(HeapStatistics::SpaceStatistics* space_stats,
53 HeapStatistics::PageStatistics** page_stats) {
56 space_stats->committed_size_bytes += (*page_stats)->committed_size_bytes;
57 space_stats->resident_size_bytes += (*page_stats)->resident_size_bytes;
58 space_stats->used_size_bytes += (*page_stats)->used_size_bytes;
60 *page_stats =
nullptr;
63void FinalizeSpace(HeapStatistics* stats,
64 HeapStatistics::SpaceStatistics** space_stats,
65 HeapStatistics::PageStatistics** page_stats) {
66 FinalizePage(*space_stats, page_stats);
69 stats->committed_size_bytes += (*space_stats)->committed_size_bytes;
70 stats->resident_size_bytes += (*space_stats)->resident_size_bytes;
71 stats->used_size_bytes += (*space_stats)->used_size_bytes;
73 *space_stats =
nullptr;
77 std::unordered_map<const void*, size_t>& type_map,
78 std::vector<HeapStatistics::ObjectStatsEntry>& object_statistics,
79 HeapObjectHeader* header,
size_t object_size) {
83 const auto it = type_map.insert({header->GetName().value, type_map.size()});
84 const size_t type_index = it.first->second;
85 if (object_statistics.size() <= type_index) {
86 object_statistics.resize(type_index + 1);
88 object_statistics[type_index].allocated_bytes += object_size;
89 object_statistics[type_index].object_count++;
109 stats.type_names[it.second] =
reinterpret_cast<const char*
>(it.first);
117 stats.resident_size_bytes);
119 size_t pooled_memory =
heap->page_backend()->page_pool().PooledMemory();
120 stats.committed_size_bytes += pooled_memory;
121 stats.resident_size_bytes += pooled_memory;
122 stats.pooled_memory_size_bytes = pooled_memory;
128 DCHECK_EQ(0u, space.linear_allocation_buffer().size());
133 InitializeSpace(
current_stats_, GetNormalPageSpaceName(space.index()));
163 const size_t object_size = page.PayloadSize();
172 if (header.
IsFree())
return true;
178 const size_t allocated_object_size =
186 allocated_object_size);
static constexpr bool SupportsCppClassNamesAsObjectNames()
static BasePage * FromPayload(void *)
HeapStatistics CollectDetailedStatistics(HeapBase *)
HeapStatistics::SpaceStatistics * current_space_stats_
bool VisitLargePage(LargePage &)
HeapStatistics::PageStatistics * current_page_stats_
HeapStatistics * current_stats_
bool VisitNormalPage(NormalPage &)
bool VisitLargePageSpace(LargePageSpace &)
bool VisitNormalPageSpace(NormalPageSpace &)
bool VisitHeapObjectHeader(HeapObjectHeader &)
std::unordered_map< const void *, size_t > type_name_to_index_map_
void Traverse(RawHeap &heap)
static LargePage * From(BasePage *page)
static size_t AllocationSize(size_t size)
size_t PayloadSize() const
static constexpr size_t kNumberOfRegularSpaces
constexpr size_t kPageSize
#define DCHECK_NOT_NULL(val)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK_EQ(v1, v2)
size_t resident_size_bytes
size_t committed_size_bytes
std::vector< ObjectStatsEntry > object_statistics
FreeListStatistics free_list_stats