Title: [122243] trunk/Source/WebCore
Revision
122243
Author
[email protected]
Date
2012-07-10 12:10:43 -0700 (Tue, 10 Jul 2012)

Log Message

Web Inspector: Count inspector memory used to traverse DOM in native memory snapshots.
https://bugs.webkit.org/show_bug.cgi?id=90456

Inspector may take significant amount of memory when traversing DOM structure.
Take it into account and report under inspector memory.

Patch by Alexei Filippov <[email protected]> on 2012-07-10
Reviewed by Pavel Feldman.

* dom/MemoryInstrumentation.h:
(MemoryInstrumentation):
(WebCore::MemoryInstrumentation::calculateContainerSize):
(WebCore::MemoryInstrumentation::reportHashMap):
(WebCore::MemoryInstrumentation::reportHashSet):
(WebCore::MemoryInstrumentation::reportVector):
* inspector/InspectorMemoryAgent.cpp:
(MemoryBlockName):
(WebCore):
(WebCore::domTreeInfo):
(WebCore::InspectorMemoryAgent::getProcessMemoryDistribution):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (122242 => 122243)


--- trunk/Source/WebCore/ChangeLog	2012-07-10 19:09:26 UTC (rev 122242)
+++ trunk/Source/WebCore/ChangeLog	2012-07-10 19:10:43 UTC (rev 122243)
@@ -1,3 +1,25 @@
+2012-07-10  Alexei Filippov  <[email protected]>
+
+        Web Inspector: Count inspector memory used to traverse DOM in native memory snapshots.
+        https://bugs.webkit.org/show_bug.cgi?id=90456
+
+        Inspector may take significant amount of memory when traversing DOM structure.
+        Take it into account and report under inspector memory.
+
+        Reviewed by Pavel Feldman.
+
+        * dom/MemoryInstrumentation.h:
+        (MemoryInstrumentation):
+        (WebCore::MemoryInstrumentation::calculateContainerSize):
+        (WebCore::MemoryInstrumentation::reportHashMap):
+        (WebCore::MemoryInstrumentation::reportHashSet):
+        (WebCore::MemoryInstrumentation::reportVector):
+        * inspector/InspectorMemoryAgent.cpp:
+        (MemoryBlockName):
+        (WebCore):
+        (WebCore::domTreeInfo):
+        (WebCore::InspectorMemoryAgent::getProcessMemoryDistribution):
+
 2012-07-10  Sudarsana Nagineni  <[email protected]>
 
         [GTK] Fix memory leaks by adopting allocation of GdkPixbuf

Modified: trunk/Source/WebCore/dom/MemoryInstrumentation.h (122242 => 122243)


--- trunk/Source/WebCore/dom/MemoryInstrumentation.h	2012-07-10 19:09:26 UTC (rev 122242)
+++ trunk/Source/WebCore/dom/MemoryInstrumentation.h	2012-07-10 19:10:43 UTC (rev 122243)
@@ -74,6 +74,12 @@
         virtual void process(MemoryInstrumentation*) = 0;
     };
 
+    template <typename Container>
+    size_t calculateContainerSize(const Container& container, bool contentOnly = false)
+    {
+        return (contentOnly ? 0 : sizeof(container)) + container.capacity() * sizeof(typename Container::ValueType);
+    }
+
 private:
     friend class MemoryObjectInfo;
 
@@ -192,8 +198,7 @@
 template<typename HashMapType>
 void MemoryInstrumentation::reportHashMap(const HashMapType& hashMap, ObjectType objectType, bool contentOnly)
 {
-    size_t size = (contentOnly ? 0 : sizeof(HashMapType)) + hashMap.capacity() * sizeof(typename HashMapType::ValueType);
-    countObjectSize(objectType, size);
+    countObjectSize(objectType, calculateContainerSize(hashMap, contentOnly));
 }
 
 template<typename HashSetType>
@@ -201,8 +206,7 @@
 {
     if (visited(&hashSet))
         return;
-    size_t size = (contentOnly ? 0 : sizeof(HashSetType)) + hashSet.capacity() * sizeof(typename HashSetType::ValueType);
-    countObjectSize(objectType, size);
+    countObjectSize(objectType, calculateContainerSize(hashSet, contentOnly));
 }
 
 template<typename ListHashSetType>
@@ -219,8 +223,7 @@
 {
     if (visited(vector.data()))
         return;
-    size_t size = (contentOnly ? 0 : sizeof(VectorType)) + vector.capacity() * sizeof(typename VectorType::ValueType);
-    countObjectSize(objectType, size);
+    countObjectSize(objectType, calculateContainerSize(vector, contentOnly));
 }
 
 template<typename T>

Modified: trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp (122242 => 122243)


--- trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp	2012-07-10 19:09:26 UTC (rev 122242)
+++ trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp	2012-07-10 19:10:43 UTC (rev 122243)
@@ -78,6 +78,8 @@
 static const char jsExternalArrays[] = "JSExternalArrays";
 static const char jsExternalStrings[] = "JSExternalStrings";
 static const char inspectorData[] = "InspectorData";
+static const char inspectorDOMData[] = "InspectorDOMData";
+static const char inspectorJSHeapData[] = "InspectorJSHeapData";
 static const char memoryCache[] = "MemoryCache";
 static const char processPrivateMemory[] = "ProcessPrivateMemory";
 
@@ -109,7 +111,7 @@
 
 size_t stringSize(StringImpl* string)
 {
-    // TODO: support substrings
+    // FIXME: support substrings
     size_t size = string->length();
     if (string->is8Bit()) {
         if (string->has16BitShadow()) {
@@ -357,6 +359,38 @@
     size_t m_externalArraySize;
 };
 
+class InspectorDataCounter {
+public:
+    void addComponent(const String& name, size_t size)
+    {
+        m_components.append(ComponentInfo(name, size));
+    }
+
+    PassRefPtr<InspectorMemoryBlock> dumpStatistics()
+    {
+        size_t totalSize = 0;
+        RefPtr<InspectorMemoryBlock> block = InspectorMemoryBlock::create().setName(MemoryBlockName::inspectorData);
+        for (Vector<ComponentInfo>::iterator it = m_components.begin(); it != m_components.end(); ++it) {
+            RefPtr<InspectorMemoryBlock> block = InspectorMemoryBlock::create().setName(it->m_name);
+            block->setSize(it->m_size);
+            totalSize += it->m_size;
+        }
+        block->setSize(totalSize);
+        return block;
+    }
+
+private:
+    class ComponentInfo {
+    public:
+        ComponentInfo(const String& name, size_t size) : m_name(name), m_size(size) { }
+
+        const String m_name;
+        size_t m_size;
+    };
+
+    Vector<ComponentInfo> m_components;
+};
+
 } // namespace
 
 InspectorMemoryAgent::~InspectorMemoryAgent()
@@ -399,14 +433,6 @@
     return jsHeapAllocated.release();
 }
 
-static PassRefPtr<InspectorMemoryBlock> inspectorData()
-{
-    size_t dataSize = ScriptProfiler::profilerSnapshotsSize();
-    RefPtr<InspectorMemoryBlock> inspectorData = InspectorMemoryBlock::create().setName(MemoryBlockName::inspectorData);
-    inspectorData->setSize(dataSize);
-    return inspectorData.release();
-}
-
 static PassRefPtr<InspectorMemoryBlock> renderTreeInfo(Page* page)
 {
     ArenaSize arenaSize = page->renderTreeSize();
@@ -441,8 +467,13 @@
             m_totalSizes[i] = 0;
     }
 
-    PassRefPtr<InspectorMemoryBlock> dumpStatistics()
+    PassRefPtr<InspectorMemoryBlock> dumpStatistics(InspectorDataCounter* inspectorData)
     {
+        size_t inspectorSize
+            = calculateContainerSize(m_visitedObjects)
+            + calculateContainerSize(m_deferredInstrumentedPointers);
+        inspectorData->addComponent(MemoryBlockName::inspectorDOMData, inspectorSize);
+
         size_t totalSize = 0;
         for (int i = Other; i < LastTypeEntry; ++i)
             totalSize += m_totalSizes[i];
@@ -519,7 +550,10 @@
         ScriptProfiler::collectBindingMemoryInfo(&m_domMemoryUsage);
     }
 
-    PassRefPtr<InspectorMemoryBlock> dumpStatistics() { return m_domMemoryUsage.dumpStatistics(); }
+    PassRefPtr<InspectorMemoryBlock> dumpStatistics(InspectorDataCounter* inspectorData)
+    {
+        return m_domMemoryUsage.dumpStatistics(inspectorData);
+    }
 
 private:
     Page* m_page;
@@ -528,7 +562,7 @@
 
 }
 
-static PassRefPtr<InspectorMemoryBlock> domTreeInfo(Page* page, VisitedObjects& visitedObjects)
+static PassRefPtr<InspectorMemoryBlock> domTreeInfo(Page* page, VisitedObjects& visitedObjects, InspectorDataCounter* inspectorData)
 {
     DOMTreesIterator domTreesIterator(page, visitedObjects);
     ScriptProfiler::visitNodeWrappers(&domTreesIterator);
@@ -541,7 +575,7 @@
 
     domTreesIterator.visitBindings();
 
-    return domTreesIterator.dumpStatistics();
+    return domTreesIterator.dumpStatistics(inspectorData);
 }
 
 static PassRefPtr<InspectorMemoryBlock> memoryCacheInfo()
@@ -588,21 +622,25 @@
 
 void InspectorMemoryAgent::getProcessMemoryDistribution(ErrorString*, RefPtr<InspectorMemoryBlock>& processMemory)
 {
-    size_t privateBytes = 0;
-    size_t sharedBytes = 0;
-    MemoryUsageSupport::processMemorySizesInBytes(&privateBytes, &sharedBytes);
     processMemory = InspectorMemoryBlock::create().setName(MemoryBlockName::processPrivateMemory);
-    processMemory->setSize(privateBytes);
 
+    InspectorDataCounter inspectorData;
+    inspectorData.addComponent(MemoryBlockName::inspectorJSHeapData, ScriptProfiler::profilerSnapshotsSize());
+
     VisitedObjects visitedObjects;
     RefPtr<TypeBuilder::Array<InspectorMemoryBlock> > children = TypeBuilder::Array<InspectorMemoryBlock>::create();
     children->addItem(jsHeapInfo());
-    children->addItem(inspectorData());
     children->addItem(memoryCacheInfo());
-    children->addItem(renderTreeInfo(m_page)); // TODO: collect for all pages?
-    children->addItem(domTreeInfo(m_page, visitedObjects)); // TODO: collect for all pages?
+    children->addItem(renderTreeInfo(m_page)); // FIXME: collect for all pages?
+    children->addItem(domTreeInfo(m_page, visitedObjects, &inspectorData)); // FIXME: collect for all pages?
     children->addItem(jsExternalResourcesInfo(visitedObjects));
+    children->addItem(inspectorData.dumpStatistics());
     processMemory->setChildren(children);
+
+    size_t privateBytes = 0;
+    size_t sharedBytes = 0;
+    MemoryUsageSupport::processMemorySizesInBytes(&privateBytes, &sharedBytes);
+    processMemory->setSize(privateBytes);
 }
 
 InspectorMemoryAgent::InspectorMemoryAgent(InstrumentingAgents* instrumentingAgents, InspectorState* state, Page* page, InspectorDOMAgent*)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to