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

Unified Diff: Source/platform/heap/Heap.cpp

Issue 738773003: Revert of Oilpan: Refactor the way we calculate heap statistics (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/platform/heap/Heap.h ('k') | Source/platform/heap/HeapTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/heap/Heap.cpp
diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp
index 0635deefb2cedbaaf9b315872b551fc4392c5991..784bdc0613d7d4ded03de783d25768611c835425 100644
--- a/Source/platform/heap/Heap.cpp
+++ b/Source/platform/heap/Heap.cpp
@@ -681,16 +681,12 @@
clearFreeLists();
// Add the ThreadHeap's pages to the orphanedPagePool.
- for (HeapPage<Header>* page = m_firstPage; page; page = page->m_next) {
- Heap::decreaseAllocatedSpace(blinkPageSize);
+ for (HeapPage<Header>* page = m_firstPage; page; page = page->m_next)
Heap::orphanedPagePool()->addOrphanedPage(m_index, page);
- }
m_firstPage = 0;
- for (LargeHeapObject<Header>* largeObject = m_firstLargeHeapObject; largeObject; largeObject = largeObject->m_next) {
- Heap::decreaseAllocatedSpace(largeObject->size());
+ for (LargeHeapObject<Header>* largeObject = m_firstLargeHeapObject; largeObject; largeObject = largeObject->m_next)
Heap::orphanedPagePool()->addOrphanedPage(m_index, largeObject);
- }
m_firstLargeHeapObject = 0;
}
@@ -698,7 +694,7 @@
void ThreadHeap<Header>::updateRemainingAllocationSize()
{
if (m_lastRemainingAllocationSize > remainingAllocationSize()) {
- Heap::increaseAllocatedObjectSize(m_lastRemainingAllocationSize - remainingAllocationSize());
+ stats().increaseObjectSpace(m_lastRemainingAllocationSize - remainingAllocationSize());
m_lastRemainingAllocationSize = remainingAllocationSize();
}
ASSERT(m_lastRemainingAllocationSize == remainingAllocationSize());
@@ -966,7 +962,7 @@
ASSERT(basicHeader->size() < blinkPagePayloadSize());
if (basicHeader->isPromptlyFreed()) {
- Heap::decreaseAllocatedObjectSize(reinterpret_cast<Header*>(basicHeader)->size());
+ stats().decreaseObjectSpace(reinterpret_cast<Header*>(basicHeader)->size());
size_t size = basicHeader->size();
ASSERT(size >= sizeof(Header));
#if !ENABLE(ASSERT) && !defined(LEAK_SANITIZER) && !defined(ADDRESS_SANITIZER)
@@ -1050,8 +1046,8 @@
ASAN_POISON_MEMORY_REGION(header, sizeof(*header));
ASAN_POISON_MEMORY_REGION(largeObject->address() + largeObject->size(), allocationGranularity);
largeObject->link(&m_firstLargeHeapObject);
- Heap::increaseAllocatedSpace(largeObject->size());
- Heap::increaseAllocatedObjectSize(largeObject->size());
+ stats().increaseAllocatedSpace(largeObject->size());
+ stats().increaseObjectSpace(largeObject->size());
return result;
}
@@ -1060,7 +1056,6 @@
{
object->unlink(previousNext);
object->finalize();
- Heap::decreaseAllocatedSpace(object->size());
// Unpoison the object header and allocationGranularity bytes after the
// object before freeing.
@@ -1282,8 +1277,6 @@
template <typename Header>
void ThreadHeap<Header>::removePageFromHeap(HeapPage<Header>* page)
{
- Heap::decreaseAllocatedSpace(blinkPageSize);
-
MutexLocker locker(m_threadState->sweepMutex());
if (page->terminating()) {
// The thread is shutting down so this page is being removed as part
@@ -1337,7 +1330,6 @@
}
}
HeapPage<Header>* page = new (pageMemory->writableStart()) HeapPage<Header>(pageMemory, this, gcInfo);
- Heap::increaseAllocatedSpace(blinkPageSize);
// Use a separate list for pages allocated during sweeping to make
// sure that we do not accidentally sweep objects that have been
// allocated during sweeping.
@@ -1375,19 +1367,17 @@
#endif
template<typename Header>
-size_t ThreadHeap<Header>::objectPayloadSizeForTesting()
+void ThreadHeap<Header>::getStatsForTesting(HeapStats& stats)
{
ASSERT(!m_firstPageAllocatedDuringSweeping);
- size_t objectPayloadSize = 0;
for (HeapPage<Header>* page = m_firstPage; page; page = page->next())
- objectPayloadSize += page->objectPayloadSizeForTesting();
+ page->getStatsForTesting(stats);
for (LargeHeapObject<Header>* current = m_firstLargeHeapObject; current; current = current->next())
- objectPayloadSize += current->objectPayloadSizeForTesting();
- return objectPayloadSize;
-}
-
-template<typename Header>
-void ThreadHeap<Header>::sweepNormalPages()
+ current->getStatsForTesting(stats);
+}
+
+template<typename Header>
+void ThreadHeap<Header>::sweepNormalPages(HeapStats* stats)
{
TRACE_EVENT0("blink_gc", "ThreadHeap::sweepNormalPages");
HeapPage<Header>* page = m_firstPage;
@@ -1403,7 +1393,7 @@
HeapPage<Header>::unlink(this, unused, previousNext);
--m_numberOfNormalPages;
} else {
- page->sweep(this);
+ page->sweep(stats, this);
previousNext = &page->m_next;
previous = page;
page = page->next();
@@ -1412,13 +1402,14 @@
}
template<typename Header>
-void ThreadHeap<Header>::sweepLargePages()
+void ThreadHeap<Header>::sweepLargePages(HeapStats* stats)
{
TRACE_EVENT0("blink_gc", "ThreadHeap::sweepLargePages");
LargeHeapObject<Header>** previousNext = &m_firstLargeHeapObject;
for (LargeHeapObject<Header>* current = m_firstLargeHeapObject; current;) {
if (current->isMarked()) {
- Heap::increaseMarkedObjectSize(current->size());
+ stats->increaseAllocatedSpace(current->size());
+ stats->increaseObjectSpace(current->size());
current->unmark();
previousNext = &current->m_next;
current = current->next();
@@ -1439,7 +1430,7 @@
#define STRICT_ASAN_FINALIZATION_CHECKING 0
template<typename Header>
-void ThreadHeap<Header>::sweep()
+void ThreadHeap<Header>::sweep(HeapStats* stats)
{
ASSERT(isConsistentForSweeping());
#if defined(ADDRESS_SANITIZER) && STRICT_ASAN_FINALIZATION_CHECKING
@@ -1450,8 +1441,8 @@
for (HeapPage<Header>* page = m_firstPage; page; page = page->next())
page->poisonUnmarkedObjects();
#endif
- sweepNormalPages();
- sweepLargePages();
+ sweepNormalPages(stats);
+ sweepLargePages(stats);
}
template<typename Header>
@@ -1551,6 +1542,7 @@
COMPILE_ASSERT(!(sizeof(HeapPage<Header>) & allocationMask), page_header_incorrectly_aligned);
m_objectStartBitMapComputed = false;
ASSERT(isPageHeaderAddress(reinterpret_cast<Address>(this)));
+ heap->stats().increaseAllocatedSpace(blinkPageSize);
}
template<typename Header>
@@ -1568,21 +1560,20 @@
}
template<typename Header>
-size_t HeapPage<Header>::objectPayloadSizeForTesting()
-{
- size_t objectPayloadSize = 0;
+void HeapPage<Header>::getStatsForTesting(HeapStats& stats)
+{
+ stats.increaseAllocatedSpace(blinkPageSize);
Address headerAddress = payload();
ASSERT(headerAddress != end());
do {
Header* header = reinterpret_cast<Header*>(headerAddress);
if (!header->isFree()) {
- objectPayloadSize += header->payloadSize();
+ stats.increaseObjectSpace(header->payloadSize());
}
ASSERT(header->size() < blinkPagePayloadSize());
headerAddress += header->size();
ASSERT(headerAddress <= end());
} while (headerAddress < end());
- return objectPayloadSize;
}
template<typename Header>
@@ -1593,9 +1584,10 @@
}
template<typename Header>
-void HeapPage<Header>::sweep(ThreadHeap<Header>* heap)
+void HeapPage<Header>::sweep(HeapStats* stats, ThreadHeap<Header>* heap)
{
clearObjectStartBitMap();
+ stats->increaseAllocatedSpace(blinkPageSize);
Address startOfGap = payload();
for (Address headerAddress = startOfGap; headerAddress < end(); ) {
BasicObjectHeader* basicHeader = reinterpret_cast<BasicObjectHeader*>(headerAddress);
@@ -1641,7 +1633,7 @@
heap->addToFreeList(startOfGap, headerAddress - startOfGap);
header->unmark();
headerAddress += header->size();
- Heap::increaseMarkedObjectSize(header->size());
+ stats->increaseObjectSpace(header->size());
startOfGap = headerAddress;
}
if (startOfGap != end())
@@ -1867,9 +1859,10 @@
}
template<typename Header>
-size_t LargeHeapObject<Header>::objectPayloadSizeForTesting()
-{
- return payloadSize();
+void LargeHeapObject<Header>::getStatsForTesting(HeapStats& stats)
+{
+ stats.increaseAllocatedSpace(size());
+ stats.increaseObjectSpace(payloadSize());
}
#if ENABLE(GC_PROFILE_HEAP)
@@ -2209,9 +2202,6 @@
s_freePagePool = new FreePagePool();
s_orphanedPagePool = new OrphanedPagePool();
s_markingThreads = new Vector<OwnPtr<WebThread>>();
- s_allocatedObjectSize = 0;
- s_allocatedSpace = 0;
- s_markedObjectSize = 0;
if (Platform::current()) {
int processors = Platform::current()->numberOfProcessors();
int numberOfMarkingThreads = std::min(processors, maxNumberOfMarkingThreads);
@@ -2255,7 +2245,6 @@
delete s_regionTree;
s_regionTree = 0;
ThreadState::shutdown();
- ASSERT(Heap::allocatedSpace() == 0);
}
BaseHeapPage* Heap::contains(Address address)
@@ -2508,9 +2497,6 @@
s_lastGCWasConservative = false;
- Heap::resetMarkedObjectSize();
- Heap::resetAllocatedObjectSize();
-
TRACE_EVENT2("blink_gc", "Heap::collectGarbage",
"precise", stackState == ThreadState::NoHeapPointersOnStack,
"forced", cause == ThreadState::ForcedGC);
@@ -2569,9 +2555,12 @@
#endif
if (Platform::current()) {
+ uint64_t objectSpaceSize;
+ uint64_t allocatedSpaceSize;
+ getHeapSpaceSize(&objectSpaceSize, &allocatedSpaceSize);
Platform::current()->histogramCustomCounts("BlinkGC.CollectGarbage", WTF::currentTimeMS() - timeStamp, 0, 10 * 1000, 50);
- Platform::current()->histogramCustomCounts("BlinkGC.TotalObjectSpace", Heap::allocatedObjectSize() / 1024, 0, 4 * 1024 * 1024, 50);
- Platform::current()->histogramCustomCounts("BlinkGC.TotalAllocatedSpace", Heap::allocatedSpace() / 1024, 0, 4 * 1024 * 1024, 50);
+ Platform::current()->histogramCustomCounts("BlinkGC.TotalObjectSpace", objectSpaceSize / 1024, 0, 4 * 1024 * 1024, 50);
+ Platform::current()->histogramCustomCounts("BlinkGC.TotalAllocatedSpace", allocatedSpaceSize / 1024, 0, 4 * 1024 * 1024, 50);
}
if (state->isMainThread())
@@ -2810,17 +2799,31 @@
}
}
-size_t Heap::objectPayloadSizeForTesting()
-{
- size_t objectPayloadSize = 0;
+void Heap::getHeapSpaceSize(uint64_t* objectSpaceSize, uint64_t* allocatedSpaceSize)
+{
+ *objectSpaceSize = 0;
+ *allocatedSpaceSize = 0;
+ ASSERT(ThreadState::isAnyThreadInGC());
+ ThreadState::AttachedThreadStateSet& threads = ThreadState::attachedThreads();
+ typedef ThreadState::AttachedThreadStateSet::iterator ThreadStateIterator;
+ for (ThreadStateIterator it = threads.begin(), end = threads.end(); it != end; ++it) {
+ *objectSpaceSize += (*it)->stats().totalObjectSpace();
+ *allocatedSpaceSize += (*it)->stats().totalAllocatedSpace();
+ }
+}
+
+void Heap::getStatsForTesting(HeapStats* stats)
+{
+ stats->clear();
ASSERT(ThreadState::isAnyThreadInGC());
makeConsistentForSweeping();
ThreadState::AttachedThreadStateSet& threads = ThreadState::attachedThreads();
typedef ThreadState::AttachedThreadStateSet::iterator ThreadStateIterator;
for (ThreadStateIterator it = threads.begin(), end = threads.end(); it != end; ++it) {
- objectPayloadSize += (*it)->objectPayloadSizeForTesting();
- }
- return objectPayloadSize;
+ HeapStats temp;
+ (*it)->getStatsForTesting(temp);
+ stats->add(&temp);
+ }
}
#if ENABLE(ASSERT)
@@ -3006,8 +3009,5 @@
FreePagePool* Heap::s_freePagePool;
OrphanedPagePool* Heap::s_orphanedPagePool;
Heap::RegionTree* Heap::s_regionTree = 0;
-size_t Heap::s_allocatedObjectSize = 0;
-size_t Heap::s_allocatedSpace = 0;
-size_t Heap::s_markedObjectSize = 0;
} // namespace blink
« no previous file with comments | « Source/platform/heap/Heap.h ('k') | Source/platform/heap/HeapTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698