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

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

Issue 383743002: Oilpan: GC profiling. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: removed Profiling.h Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: Source/platform/heap/Heap.cpp
diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp
index 12ec6247943ac8cd996870e4130d65cf48508c2c..da0bc0d4c85aa8c0c081d6304767396fc951aa2b 100644
--- a/Source/platform/heap/Heap.cpp
+++ b/Source/platform/heap/Heap.cpp
@@ -39,7 +39,7 @@
#include "wtf/Assertions.h"
#include "wtf/LeakAnnotations.h"
#include "wtf/PassOwnPtr.h"
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
#include "wtf/HashMap.h"
#include "wtf/HashSet.h"
#include "wtf/text/StringBuilder.h"
@@ -47,6 +47,9 @@
#include <stdio.h>
#include <utility>
#endif
+#if ENABLE(GC_PROFILE_HEAP)
+#include "platform/TracedValue.h"
+#endif
#if OS(POSIX)
#include <sys/mman.h>
@@ -57,7 +60,7 @@
namespace blink {
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
static String classOf(const void* object)
{
const GCInfo* gcInfo = Heap::findGCInfo(reinterpret_cast<Address>(const_cast<void*>(object)));
@@ -369,10 +372,10 @@ public:
, m_safePointScope(stackState)
, m_parkedAllThreads(false)
{
- TRACE_EVENT0("blink", "Heap::GCScope");
+ TRACE_EVENT0("blinkGC", "Heap::GCScope");
tkent 2014/08/05 00:38:10 should be "blink_gc" for consistency with "blink_r
const char* samplingState = TRACE_EVENT_GET_SAMPLING_STATE();
if (m_state->isMainThread())
- TRACE_EVENT_SET_SAMPLING_STATE("blink", "BlinkGCWaiting");
+ TRACE_EVENT_SET_SAMPLING_STATE("blinkGC", "BlinkGCWaiting");
m_state->checkThread();
@@ -512,7 +515,7 @@ void LargeHeapObject<Header>::checkAndMarkPointer(Visitor* visitor, Address addr
ASSERT(contains(address));
if (!objectContains(address) || heapObjectHeader()->hasDeadMark())
return;
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
visitor->setHostInfo(&address, "stack");
#endif
mark(visitor);
@@ -662,7 +665,7 @@ BaseHeapPage* ThreadHeap<Header>::heapPageFromAddress(Address address)
return 0;
}
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
template<typename Header>
const GCInfo* ThreadHeap<Header>::findGCInfoOfLargeHeapObject(Address address)
{
@@ -674,6 +677,39 @@ const GCInfo* ThreadHeap<Header>::findGCInfoOfLargeHeapObject(Address address)
}
#endif
+#if ENABLE(GC_PROFILE_HEAP)
+#define GC_PROFILE_HEAP_PAGE_SNAPSHOT_THRESHOLD 0
+template<typename Header>
+void ThreadHeap<Header>::snapshot(TracedDictionaryBase* json, ThreadState::SnapshotInfo* info)
+{
+ size_t previousPageCount = info->pageCount;
+
+ TracedArray<TracedDictionaryBase>& pages = json->beginArray("pages");
+ for (HeapPage<Header>* page = m_firstPage; page; page = page->next(), ++info->pageCount) {
+ // FIXME: To limit the size of the snapshot we only output "threshold" many page snapshots.
+ TracedArray<TracedArray<TracedDictionaryBase> >* jsonPage = 0;
+ if (info->pageCount < GC_PROFILE_HEAP_PAGE_SNAPSHOT_THRESHOLD) {
+ jsonPage = &pages.beginArray();
+ jsonPage->pushInteger(reinterpret_cast<intptr_t>(page));
+ }
+ page->snapshot(jsonPage, info);
+ if (jsonPage)
+ jsonPage->endArray();
+ }
+ pages.endArray();
+
+ TracedArray<TracedDictionaryBase>& largeObjects = json->beginArray("largeObjects");
+ for (LargeHeapObject<Header>* current = m_firstLargeHeapObject; current; current = current->next()) {
+ TracedDictionary<TracedArray<TracedDictionaryBase> >& jsonCurrent = largeObjects.beginDictionary();
+ current->snapshot(&jsonCurrent, info);
+ jsonCurrent.endDictionary();
+ }
+ largeObjects.endArray();
+
+ json->setInteger("pageCount", info->pageCount - previousPageCount);
+}
+#endif
+
template<typename Header>
void ThreadHeap<Header>::addToFreeList(Address address, size_t size)
{
@@ -1322,7 +1358,7 @@ void HeapPage<Header>::checkAndMarkPointer(Visitor* visitor, Address address)
if (!header || header->hasDeadMark())
return;
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
visitor->setHostInfo(&address, "stack");
#endif
if (hasVTable(header) && !vTableInitialized(header->payload()))
@@ -1331,7 +1367,7 @@ void HeapPage<Header>::checkAndMarkPointer(Visitor* visitor, Address address)
visitor->mark(header, traceCallback(header));
}
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
template<typename Header>
const GCInfo* HeapPage<Header>::findGCInfo(Address address)
{
@@ -1349,6 +1385,42 @@ const GCInfo* HeapPage<Header>::findGCInfo(Address address)
}
#endif
+#if ENABLE(GC_PROFILE_HEAP)
+template<typename Header>
+void HeapPage<Header>::snapshot(TracedArrayBase* json, ThreadState::SnapshotInfo* info)
+{
+ Header* header = 0;
+ for (Address addr = payload(); addr < end(); addr += header->size()) {
+ header = reinterpret_cast<Header*>(addr);
+ if (json)
+ json->pushInteger(header->encodedSize());
+ if (header->isFree()) {
+ info->freeSize += header->size();
+ continue;
+ }
+
+ size_t tag = info->getClassTag(header->gcInfo());
+ size_t age = header->age();
+ if (json)
+ json->pushInteger(tag);
+ if (header->isMarked()) {
+ info->liveCount[tag] += 1;
+ info->liveSize += header->size();
+ // Count objects that are live when promoted to the final generation.
+ if (age == maxHeapObjectAge - 1)
+ info->generations[tag][maxHeapObjectAge] += 1;
+ header->incAge();
+ } else {
+ info->deadCount[tag] += 1;
+ info->deadSize += header->size();
+ // Count objects that are dead before the final generation.
+ if (age < maxHeapObjectAge)
+ info->generations[tag][age] += 1;
+ }
+ }
+}
+#endif
+
#if defined(ADDRESS_SANITIZER)
template<typename Header>
void HeapPage<Header>::poisonUnmarkedObjects()
@@ -1410,6 +1482,36 @@ void LargeHeapObject<Header>::getStats(HeapStats& stats)
stats.increaseObjectSpace(payloadSize());
}
+#if ENABLE(GC_PROFILE_HEAP)
+template<typename Header>
+void LargeHeapObject<Header>::snapshot(TracedDictionaryBase* json, ThreadState::SnapshotInfo* info)
+{
+ Header* header = heapObjectHeader();
+ size_t tag = info->getClassTag(header->gcInfo());
+ size_t age = header->age();
+ if (isMarked()) {
+ info->liveCount[tag] += 1;
+ info->liveSize += header->size();
+ // Count objects that are live when promoted to the final generation.
+ if (age == maxHeapObjectAge - 1)
+ info->generations[tag][maxHeapObjectAge] += 1;
+ header->incAge();
+ } else {
+ info->deadCount[tag] += 1;
+ info->deadSize += header->size();
+ // Count objects that are dead before the final generation.
+ if (age < maxHeapObjectAge)
+ info->generations[tag][age] += 1;
+ }
+
+ if (json) {
+ json->setInteger("class", tag)
+ .setInteger("size", header->size())
+ .setInteger("isMarked", isMarked());
+ }
+}
+#endif
+
template<typename Entry>
void HeapExtentCache<Entry>::flush()
{
@@ -1548,7 +1650,7 @@ bool CallbackStack::popAndInvokeCallback(CallbackStack** first, Visitor* visitor
// collection. However we assert it in Heap::pushWeakObjectPointerCallback.
VisitorCallback callback = item->callback();
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
if (ThreadState::isAnyThreadInGC()) // weak-processing will also use popAndInvokeCallback
visitor->setHostInfo(item->object(), classOf(item->object()));
#endif
@@ -1623,7 +1725,7 @@ bool CallbackStack::hasCallbackForObject(const void* object)
class MarkingVisitor : public Visitor {
public:
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
typedef HashSet<uintptr_t> LiveObjectSet;
typedef HashMap<String, LiveObjectSet> LiveObjectMap;
typedef HashMap<uintptr_t, std::pair<uintptr_t, String> > ObjectGraph;
@@ -1640,7 +1742,7 @@ public:
if (header->isMarked())
return;
header->mark();
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
MutexLocker locker(objectGraphMutex());
String className(classOf(objectPointer));
{
@@ -1746,7 +1848,7 @@ public:
FOR_EACH_TYPED_HEAP(DEFINE_VISITOR_METHODS)
#undef DEFINE_VISITOR_METHODS
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
void reportStats()
{
fprintf(stderr, "\n---------- AFTER MARKING -------------------\n");
@@ -1937,12 +2039,14 @@ Address Heap::checkAndMarkPointer(Visitor* visitor, Address address)
return 0;
}
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
const GCInfo* Heap::findGCInfo(Address address)
{
return ThreadState::findGCInfoFromAllThreads(address);
}
+#endif
+#if ENABLE(GC_PROFILE_MARKING)
void Heap::dumpPathToObjectOnNextGC(void* p)
{
static_cast<MarkingVisitor*>(s_markingVisitor)->dumpPathToObjectOnNextGC(p);
@@ -2065,10 +2169,10 @@ void Heap::collectGarbage(ThreadState::StackState stackState)
ScriptForbiddenScope forbiddenScope;
s_lastGCWasConservative = false;
- TRACE_EVENT0("blink", "Heap::collectGarbage");
- TRACE_EVENT_SCOPED_SAMPLING_STATE("blink", "BlinkGC");
+ TRACE_EVENT0("blinkGC", "Heap::collectGarbage");
+ TRACE_EVENT_SCOPED_SAMPLING_STATE("blinkGC", "BlinkGC");
double timeStamp = WTF::currentTimeMS();
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
static_cast<MarkingVisitor*>(s_markingVisitor)->objectGraph().clear();
#endif
@@ -2106,7 +2210,7 @@ void Heap::collectGarbage(ThreadState::StackState stackState)
// a dangling pointer.
orphanedPagePool()->decommitOrphanedPages();
-#if ENABLE(GC_TRACING)
+#if ENABLE(GC_PROFILE_MARKING)
static_cast<MarkingVisitor*>(s_markingVisitor)->reportStats();
#endif

Powered by Google App Engine
This is Rietveld 408576698