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*)