Index: Source/platform/heap/Heap.cpp |
diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp |
index 77edb3bf7afa908f3e56529d1346c997e9afd1d1..181fe881aff02c5b41691d05fc0ecc19f05b123e 100644 |
--- a/Source/platform/heap/Heap.cpp |
+++ b/Source/platform/heap/Heap.cpp |
@@ -259,14 +259,15 @@ void BaseHeap::cleanupPages() |
m_firstPage = nullptr; |
} |
-void BaseHeap::takeSnapshot(const String& dumpBaseName) |
+void BaseHeap::takeSnapshot(const String& dumpBaseName, ThreadState::GCSnapshotInfo& info) |
{ |
- size_t pageCount = 0; |
+ WebMemoryAllocatorDump* allocatorDump = BlinkGCMemoryDumpProvider::instance()->createMemoryAllocatorDumpForCurrentGC(dumpBaseName); |
+ size_t pageIndex = 0; |
for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) { |
- pageCount++; |
+ page->takeSnapshot(dumpBaseName, pageIndex, info); |
+ pageIndex++; |
} |
- WebMemoryAllocatorDump* allocatorDump = BlinkGCMemoryDumpProvider::instance()->createMemoryAllocatorDumpForCurrentGC(dumpBaseName); |
- allocatorDump->AddScalar("blink_page_count", "objects", pageCount); |
+ allocatorDump->AddScalar("blink_page_count", "objects", pageIndex); |
} |
#if ENABLE(ASSERT) || ENABLE(GC_PROFILING) |
@@ -568,6 +569,11 @@ bool NormalPageHeap::pagesToBeSweptContains(Address address) |
} |
#endif |
+void NormalPageHeap::takeFreelistSnapshot(const String& dumpName) |
+{ |
+ m_freeList.takeSnapshot(dumpName); |
+} |
+ |
#if ENABLE(GC_PROFILING) |
void NormalPageHeap::snapshotFreeList(TracedValue& json) |
{ |
@@ -1126,6 +1132,23 @@ int FreeList::bucketIndexForSize(size_t size) |
return index; |
} |
+void FreeList::takeSnapshot(const String& dumpBaseName) |
+{ |
+ for (size_t i = 0; i < blinkPageSizeLog2; ++i) { |
+ size_t entryCount = 0; |
+ size_t freeSize = 0; |
+ for (FreeListEntry* entry = m_freeLists[i]; entry; entry = entry->next()) { |
+ ++entryCount; |
+ freeSize += entry->size(); |
+ } |
+ |
+ String dumpName = dumpBaseName + String::format("/buckets/bucket_%lu", static_cast<unsigned long>(1 << i)); |
+ WebMemoryAllocatorDump* bucketDump = BlinkGCMemoryDumpProvider::instance()->createMemoryAllocatorDumpForCurrentGC(dumpName); |
+ bucketDump->AddScalar("freelist_entry_count", "objects", entryCount); |
+ bucketDump->AddScalar("free_size", "bytes", freeSize); |
+ } |
+} |
+ |
#if ENABLE(GC_PROFILING) |
void FreeList::getFreeSizeStats(PerBucketFreeListStats bucketStats[], size_t& totalFreeSize) const |
{ |
@@ -1457,6 +1480,47 @@ void NormalPage::markOrphaned() |
BasePage::markOrphaned(); |
} |
+void NormalPage::takeSnapshot(String dumpName, size_t pageIndex, ThreadState::GCSnapshotInfo& info) |
+{ |
+ dumpName.append(String::format("/pages/page_%lu", static_cast<unsigned long>(pageIndex))); |
+ WebMemoryAllocatorDump* pageDump = BlinkGCMemoryDumpProvider::instance()->createMemoryAllocatorDumpForCurrentGC(dumpName); |
+ |
+ HeapObjectHeader* header = nullptr; |
+ size_t liveCount = 0; |
+ size_t deadCount = 0; |
+ size_t freeCount = 0; |
+ size_t liveSize = 0; |
+ size_t deadSize = 0; |
+ size_t freeSize = 0; |
+ for (Address headerAddress = payload(); headerAddress < payloadEnd(); headerAddress += header->size()) { |
+ header = reinterpret_cast<HeapObjectHeader*>(headerAddress); |
+ size_t tag = info.getClassTag(Heap::gcInfo(header->gcInfoIndex())); |
haraken
2015/06/23 12:59:47
header->gcInfoIndex() is available only when the h
ssid
2015/06/23 19:40:02
Ah, I see. Thanks :)
|
+ |
+ if (header->isFree()) { |
+ freeCount++; |
+ freeSize += header->size(); |
+ } else if (header->isMarked()) { |
+ liveCount++; |
+ liveSize += header->size(); |
+ info.liveCount[tag]++; |
+ info.liveSize[tag] += header->size(); |
+ } else { |
+ deadCount++; |
+ deadSize += header->size(); |
+ info.deadCount[tag]++; |
+ info.deadSize[tag] += header->size(); |
+ } |
+ } |
+ |
+ pageDump->AddScalar("live_count", "objects", liveCount); |
+ pageDump->AddScalar("dead_count", "objects", deadCount); |
+ pageDump->AddScalar("free_count", "objects", freeCount); |
+ pageDump->AddScalar("live_size", "bytes", liveSize); |
+ pageDump->AddScalar("dead_size", "bytes", deadSize); |
+ pageDump->AddScalar("free_size", "bytes", freeSize); |
+ |
+} |
+ |
#if ENABLE(GC_PROFILING) |
const GCInfo* NormalPage::findGCInfo(Address address) |
{ |
@@ -1632,6 +1696,35 @@ void LargeObjectPage::markOrphaned() |
BasePage::markOrphaned(); |
} |
+void LargeObjectPage::takeSnapshot(String dumpName, size_t pageIndex, ThreadState::GCSnapshotInfo& info) |
+{ |
+ dumpName.append(String::format("/pages/page_%lu", static_cast<unsigned long>(pageIndex))); |
+ WebMemoryAllocatorDump* pageDump = BlinkGCMemoryDumpProvider::instance()->createMemoryAllocatorDumpForCurrentGC(dumpName); |
+ |
+ size_t liveSize = 0; |
+ size_t deadSize = 0; |
+ size_t liveCount = 0; |
+ size_t deadCount = 0; |
+ HeapObjectHeader* header = heapObjectHeader(); |
+ size_t tag = info.getClassTag(Heap::gcInfo(header->gcInfoIndex())); |
+ if (header->isMarked()) { |
+ liveCount = 1; |
+ liveSize += header->size(); |
+ info.liveCount[tag]++; |
+ info.liveSize[tag] += header->size(); |
+ } else { |
+ deadCount = 1; |
+ deadSize += header->size(); |
+ info.deadCount[tag]++; |
+ info.deadSize[tag] += header->size(); |
+ } |
+ |
+ pageDump->AddScalar("live_count", "objects", liveCount); |
+ pageDump->AddScalar("dead_count", "objects", deadCount); |
+ pageDump->AddScalar("live_size", "bytes", liveSize); |
+ pageDump->AddScalar("dead_size", "bytes", deadSize); |
+} |
+ |
#if ENABLE(GC_PROFILING) |
const GCInfo* LargeObjectPage::findGCInfo(Address address) |
{ |