Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side Diff: Source/platform/heap/Heap.cpp

Issue 1203493004: [tracing] Adding class-wise memory statistics to blink gc memory dumps (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase errors. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 253
254 ASSERT(!m_firstUnsweptPage); 254 ASSERT(!m_firstUnsweptPage);
255 // Add the BaseHeap's pages to the orphanedPagePool. 255 // Add the BaseHeap's pages to the orphanedPagePool.
256 for (BasePage* page = m_firstPage; page; page = page->next()) { 256 for (BasePage* page = m_firstPage; page; page = page->next()) {
257 Heap::decreaseAllocatedSpace(page->size()); 257 Heap::decreaseAllocatedSpace(page->size());
258 Heap::orphanedPagePool()->addOrphanedPage(heapIndex(), page); 258 Heap::orphanedPagePool()->addOrphanedPage(heapIndex(), page);
259 } 259 }
260 m_firstPage = nullptr; 260 m_firstPage = nullptr;
261 } 261 }
262 262
263 void BaseHeap::takeSnapshot(const String& dumpBaseName) 263 void BaseHeap::takeSnapshot(const String& dumpBaseName, ThreadState::GCSnapshotI nfo& info)
264 { 264 {
265 WebMemoryAllocatorDump* allocatorDump = BlinkGCMemoryDumpProvider::instance( )->createMemoryAllocatorDumpForCurrentGC(dumpBaseName); 265 WebMemoryAllocatorDump* allocatorDump = BlinkGCMemoryDumpProvider::instance( )->createMemoryAllocatorDumpForCurrentGC(dumpBaseName);
266 size_t pageIndex = 0; 266 size_t pageIndex = 0;
267 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) { 267 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) {
268 page->takeSnapshot(dumpBaseName, pageIndex); 268 page->takeSnapshot(dumpBaseName, pageIndex, info);
269 pageIndex++; 269 pageIndex++;
270 } 270 }
271 allocatorDump->AddScalar("blink_page_count", "objects", pageIndex); 271 allocatorDump->AddScalar("blink_page_count", "objects", pageIndex);
272 } 272 }
273 273
274 #if ENABLE(ASSERT) || ENABLE(GC_PROFILING) 274 #if ENABLE(ASSERT) || ENABLE(GC_PROFILING)
275 BasePage* BaseHeap::findPageFromAddress(Address address) 275 BasePage* BaseHeap::findPageFromAddress(Address address)
276 { 276 {
277 for (BasePage* page = m_firstPage; page; page = page->next()) { 277 for (BasePage* page = m_firstPage; page; page = page->next()) {
278 if (page->contains(address)) 278 if (page->contains(address))
(...skipping 1202 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 // cross thread pointer usage. 1481 // cross thread pointer usage.
1482 #if defined(ADDRESS_SANITIZER) 1482 #if defined(ADDRESS_SANITIZER)
1483 // This needs to zap poisoned memory as well. 1483 // This needs to zap poisoned memory as well.
1484 // Force unpoison memory before memset. 1484 // Force unpoison memory before memset.
1485 ASAN_UNPOISON_MEMORY_REGION(payload(), payloadSize()); 1485 ASAN_UNPOISON_MEMORY_REGION(payload(), payloadSize());
1486 #endif 1486 #endif
1487 memset(payload(), orphanedZapValue, payloadSize()); 1487 memset(payload(), orphanedZapValue, payloadSize());
1488 BasePage::markOrphaned(); 1488 BasePage::markOrphaned();
1489 } 1489 }
1490 1490
1491 void NormalPage::takeSnapshot(String dumpName, size_t pageIndex) 1491 void NormalPage::takeSnapshot(String dumpName, size_t pageIndex, ThreadState::GC SnapshotInfo& info)
1492 { 1492 {
1493 dumpName.append(String::format("/pages/page_%lu", static_cast<unsigned long> (pageIndex))); 1493 dumpName.append(String::format("/pages/page_%lu", static_cast<unsigned long> (pageIndex)));
1494 WebMemoryAllocatorDump* pageDump = BlinkGCMemoryDumpProvider::instance()->cr eateMemoryAllocatorDumpForCurrentGC(dumpName); 1494 WebMemoryAllocatorDump* pageDump = BlinkGCMemoryDumpProvider::instance()->cr eateMemoryAllocatorDumpForCurrentGC(dumpName);
1495 1495
1496 HeapObjectHeader* header = nullptr; 1496 HeapObjectHeader* header = nullptr;
1497 size_t liveCount = 0; 1497 size_t liveCount = 0;
1498 size_t deadCount = 0; 1498 size_t deadCount = 0;
1499 size_t freeCount = 0; 1499 size_t freeCount = 0;
1500 size_t liveSize = 0; 1500 size_t liveSize = 0;
1501 size_t deadSize = 0; 1501 size_t deadSize = 0;
1502 size_t freeSize = 0; 1502 size_t freeSize = 0;
1503 for (Address headerAddress = payload(); headerAddress < payloadEnd(); header Address += header->size()) { 1503 for (Address headerAddress = payload(); headerAddress < payloadEnd(); header Address += header->size()) {
1504 header = reinterpret_cast<HeapObjectHeader*>(headerAddress); 1504 header = reinterpret_cast<HeapObjectHeader*>(headerAddress);
1505 if (header->isFree()) { 1505 if (header->isFree()) {
1506 freeCount++; 1506 freeCount++;
1507 freeSize += header->size(); 1507 freeSize += header->size();
1508 } else if (header->isMarked()) { 1508 } else if (header->isMarked()) {
1509 liveCount++; 1509 liveCount++;
1510 liveSize += header->size(); 1510 liveSize += header->size();
1511
1512 size_t tag = info.getClassTag(Heap::gcInfo(header->gcInfoIndex()));
1513 info.liveCount[tag]++;
1514 info.liveSize[tag] += header->size();
1511 } else { 1515 } else {
1512 deadCount++; 1516 deadCount++;
1513 deadSize += header->size(); 1517 deadSize += header->size();
1518
1519 size_t tag = info.getClassTag(Heap::gcInfo(header->gcInfoIndex()));
1520 info.deadCount[tag]++;
1521 info.deadSize[tag] += header->size();
1514 } 1522 }
1515 } 1523 }
1516 1524
1517 pageDump->AddScalar("live_count", "objects", liveCount); 1525 pageDump->AddScalar("live_count", "objects", liveCount);
1518 pageDump->AddScalar("dead_count", "objects", deadCount); 1526 pageDump->AddScalar("dead_count", "objects", deadCount);
1519 pageDump->AddScalar("free_count", "objects", freeCount); 1527 pageDump->AddScalar("free_count", "objects", freeCount);
1520 pageDump->AddScalar("live_size", "bytes", liveSize); 1528 pageDump->AddScalar("live_size", "bytes", liveSize);
1521 pageDump->AddScalar("dead_size", "bytes", deadSize); 1529 pageDump->AddScalar("dead_size", "bytes", deadSize);
1522 pageDump->AddScalar("free_size", "bytes", freeSize); 1530 pageDump->AddScalar("free_size", "bytes", freeSize);
1523 } 1531 }
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
1690 } 1698 }
1691 1699
1692 void LargeObjectPage::markOrphaned() 1700 void LargeObjectPage::markOrphaned()
1693 { 1701 {
1694 // Zap the payload with a recognizable value to detect any incorrect 1702 // Zap the payload with a recognizable value to detect any incorrect
1695 // cross thread pointer usage. 1703 // cross thread pointer usage.
1696 memset(payload(), orphanedZapValue, payloadSize()); 1704 memset(payload(), orphanedZapValue, payloadSize());
1697 BasePage::markOrphaned(); 1705 BasePage::markOrphaned();
1698 } 1706 }
1699 1707
1700 void LargeObjectPage::takeSnapshot(String dumpName, size_t pageIndex) 1708 void LargeObjectPage::takeSnapshot(String dumpName, size_t pageIndex, ThreadStat e::GCSnapshotInfo& info)
1701 { 1709 {
1702 dumpName.append(String::format("/pages/page_%lu", static_cast<unsigned long> (pageIndex))); 1710 dumpName.append(String::format("/pages/page_%lu", static_cast<unsigned long> (pageIndex)));
1703 WebMemoryAllocatorDump* pageDump = BlinkGCMemoryDumpProvider::instance()->cr eateMemoryAllocatorDumpForCurrentGC(dumpName); 1711 WebMemoryAllocatorDump* pageDump = BlinkGCMemoryDumpProvider::instance()->cr eateMemoryAllocatorDumpForCurrentGC(dumpName);
1704 1712
1705 size_t liveSize = 0; 1713 size_t liveSize = 0;
1706 size_t deadSize = 0; 1714 size_t deadSize = 0;
1707 size_t liveCount = 0; 1715 size_t liveCount = 0;
1708 size_t deadCount = 0; 1716 size_t deadCount = 0;
1709 HeapObjectHeader* header = heapObjectHeader(); 1717 HeapObjectHeader* header = heapObjectHeader();
1718 size_t tag = info.getClassTag(Heap::gcInfo(header->gcInfoIndex()));
1710 if (header->isMarked()) { 1719 if (header->isMarked()) {
1711 liveCount = 1; 1720 liveCount = 1;
1712 liveSize += header->size(); 1721 liveSize += header->size();
1722 info.liveCount[tag]++;
1723 info.liveSize[tag] += header->size();
haraken 2015/06/26 05:35:28 header->size() => header->payloadSize() header->s
ssid 2015/06/26 10:10:28 Done.
1713 } else { 1724 } else {
1714 deadCount = 1; 1725 deadCount = 1;
1715 deadSize += header->size(); 1726 deadSize += header->size();
1727 info.deadCount[tag]++;
1728 info.deadSize[tag] += header->size();
haraken 2015/06/26 05:35:28 Ditto.
1716 } 1729 }
1717 1730
1718 pageDump->AddScalar("live_count", "objects", liveCount); 1731 pageDump->AddScalar("live_count", "objects", liveCount);
1719 pageDump->AddScalar("dead_count", "objects", deadCount); 1732 pageDump->AddScalar("dead_count", "objects", deadCount);
1720 pageDump->AddScalar("live_size", "bytes", liveSize); 1733 pageDump->AddScalar("live_size", "bytes", liveSize);
1721 pageDump->AddScalar("dead_size", "bytes", deadSize); 1734 pageDump->AddScalar("dead_size", "bytes", deadSize);
1722 } 1735 }
1723 1736
1724 #if ENABLE(GC_PROFILING) 1737 #if ENABLE(GC_PROFILING)
1725 const GCInfo* LargeObjectPage::findGCInfo(Address address) 1738 const GCInfo* LargeObjectPage::findGCInfo(Address address)
(...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after
2444 size_t Heap::s_allocatedObjectSize = 0; 2457 size_t Heap::s_allocatedObjectSize = 0;
2445 size_t Heap::s_allocatedSpace = 0; 2458 size_t Heap::s_allocatedSpace = 0;
2446 size_t Heap::s_markedObjectSize = 0; 2459 size_t Heap::s_markedObjectSize = 0;
2447 // We don't want to use 0 KB for the initial value because it may end up 2460 // We don't want to use 0 KB for the initial value because it may end up
2448 // triggering the first GC of some thread too prematurely. 2461 // triggering the first GC of some thread too prematurely.
2449 size_t Heap::s_estimatedLiveObjectSize = 512 * 1024; 2462 size_t Heap::s_estimatedLiveObjectSize = 512 * 1024;
2450 size_t Heap::s_externalObjectSizeAtLastGC = 0; 2463 size_t Heap::s_externalObjectSizeAtLastGC = 0;
2451 double Heap::s_estimatedMarkingTimePerByte = 0.0; 2464 double Heap::s_estimatedMarkingTimePerByte = 0.0;
2452 2465
2453 } // namespace blink 2466 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698