Index: Source/platform/heap/Heap.cpp |
diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp |
index cf60075d21be7cff608d6ed77036991566c30bbf..ee78353fee1f2e20aa0e6d4c70db925e4b5823d1 100644 |
--- a/Source/platform/heap/Heap.cpp |
+++ b/Source/platform/heap/Heap.cpp |
@@ -922,6 +922,14 @@ void ThreadHeap::snapshot(TracedValue* json, ThreadState::SnapshotInfo* info) |
json->setInteger("pageCount", info->pageCount - previousPageCount); |
} |
+ |
+void ThreadHeap::incrementMarkedObjectsAge() |
+{ |
+ for (HeapPage* page = m_firstPage; page; page = page->next()) |
+ page->incrementMarkedObjectsAge(); |
+ for (LargeObject* largeObject = m_firstLargeObject; largeObject; largeObject = largeObject->next()) |
+ largeObject->incrementMarkedObjectsAge(); |
+} |
#endif |
void FreeList::addToFreeList(Address address, size_t size) |
@@ -1533,6 +1541,22 @@ void ThreadHeap::snapshotFreeList(TracedValue& json) |
json.pushInteger(bucketStats[i].freeSize); |
json.endArray(); |
} |
+ |
+void ThreadHeap::countMarkedObjects(ClassAgeCountsMap& classAgeCounts) const |
+{ |
+ for (HeapPage* page = m_firstPage; page; page = page->next()) |
+ page->countMarkedObjects(classAgeCounts); |
+ for (LargeObject* largeObject = m_firstLargeObject; largeObject; largeObject = largeObject->next()) |
+ largeObject->countMarkedObjects(classAgeCounts); |
+} |
+ |
+void ThreadHeap::countObjectsToSweep(ClassAgeCountsMap& classAgeCounts) const |
+{ |
+ for (HeapPage* page = m_firstPage; page; page = page->next()) |
+ page->countObjectsToSweep(classAgeCounts); |
+ for (LargeObject* largeObject = m_firstLargeObject; largeObject; largeObject = largeObject->next()) |
+ largeObject->countObjectsToSweep(classAgeCounts); |
+} |
#endif |
void FreeList::clear() |
@@ -1802,7 +1826,6 @@ void HeapPage::snapshot(TracedValue* json, ThreadState::SnapshotInfo* info) |
// Count objects that are live when promoted to the final generation. |
if (age == maxHeapObjectAge - 1) |
info->generations[tag][maxHeapObjectAge] += 1; |
- header->incrementAge(); |
} else { |
info->deadCount[tag] += 1; |
info->deadSize[tag] += header->size(); |
@@ -1812,6 +1835,40 @@ void HeapPage::snapshot(TracedValue* json, ThreadState::SnapshotInfo* info) |
} |
} |
} |
+ |
+void HeapPage::incrementMarkedObjectsAge() |
+{ |
+ HeapObjectHeader* header = nullptr; |
haraken
2015/02/06 06:39:20
You can declare HeapObjectHeader* inside the loop.
Yuta Kitamura
2015/02/06 07:45:45
It is used in the third part of the "for" expressi
|
+ for (Address address = payload(); address < payloadEnd(); address += header->size()) { |
+ header = reinterpret_cast<HeapObjectHeader*>(address); |
+ if (header->isMarked()) |
+ header->incrementAge(); |
+ } |
+} |
+ |
+void HeapPage::countMarkedObjects(ClassAgeCountsMap& classAgeCounts) |
+{ |
+ HeapObjectHeader* header = nullptr; |
+ for (Address address = payload(); address < payloadEnd(); address += header->size()) { |
+ header = reinterpret_cast<HeapObjectHeader*>(address); |
+ if (header->isMarked()) { |
+ String className(classOf(header->payload())); |
+ ++(classAgeCounts.add(className, AgeCounts()).storedValue->value.ages[header->age()]); |
+ } |
+ } |
+} |
+ |
+void HeapPage::countObjectsToSweep(ClassAgeCountsMap& classAgeCounts) |
+{ |
+ HeapObjectHeader* header = nullptr; |
+ for (Address address = payload(); address < payloadEnd(); address += header->size()) { |
+ header = reinterpret_cast<HeapObjectHeader*>(address); |
+ if (!header->isFree() && !header->isMarked()) { |
+ String className(classOf(header->payload())); |
+ ++(classAgeCounts.add(className, AgeCounts()).storedValue->value.ages[header->age()]); |
+ } |
+ } |
+} |
#endif |
size_t LargeObject::objectPayloadSizeForTesting() |
@@ -1840,7 +1897,6 @@ void LargeObject::snapshot(TracedValue* json, ThreadState::SnapshotInfo* info) |
// Count objects that are live when promoted to the final generation. |
if (age == maxHeapObjectAge - 1) |
info->generations[tag][maxHeapObjectAge] += 1; |
- header->incrementAge(); |
} else { |
info->deadCount[tag] += 1; |
info->deadSize[tag] += header->size(); |
@@ -1855,6 +1911,31 @@ void LargeObject::snapshot(TracedValue* json, ThreadState::SnapshotInfo* info) |
json->setInteger("isMarked", header->isMarked()); |
} |
} |
+ |
+void LargeObject::incrementMarkedObjectsAge() |
+{ |
+ HeapObjectHeader* header = heapObjectHeader(); |
+ if (header->isMarked()) |
+ header->incrementAge(); |
+} |
+ |
+void LargeObject::countMarkedObjects(ClassAgeCountsMap& classAgeCounts) |
+{ |
+ HeapObjectHeader* header = heapObjectHeader(); |
+ if (header->isMarked()) { |
+ String className(classOf(header->payload())); |
+ ++(classAgeCounts.add(className, AgeCounts()).storedValue->value.ages[header->age()]); |
+ } |
+} |
+ |
+void LargeObject::countObjectsToSweep(ClassAgeCountsMap& classAgeCounts) |
+{ |
+ HeapObjectHeader* header = heapObjectHeader(); |
+ if (!header->isFree() && !header->isMarked()) { |
+ String className(classOf(header->payload())); |
+ ++(classAgeCounts.add(className, AgeCounts()).storedValue->value.ages[header->age()]); |
+ } |
+} |
#endif |
void HeapDoesNotContainCache::flush() |