Bug 806283 - Split up and add native iterators to "object/misc" memory reports. r=jorendorff.

--HG--
extra : rebase_source : 867e178d0c921de9e144fb274e1c0d77c8845b81
This commit is contained in:
Nicholas Nethercote 2012-11-01 16:51:04 -07:00
parent aefe00a614
commit 7c4faece03
8 changed files with 83 additions and 41 deletions

View File

@ -146,10 +146,12 @@ struct CompartmentStats
#if JS_HAS_XML_SUPPORT
, gcHeapXML(0)
#endif
, objectSlots(0)
, objectElements(0)
, objectMisc(0)
, objectPrivate(0)
, objectsExtraSlots(0)
, objectsExtraElements(0)
, objectsExtraArgumentsData(0)
, objectsExtraRegExpStatics(0)
, objectsExtraPropertyIteratorData(0)
, objectsExtraPrivate(0)
, stringCharsNonHuge(0)
, shapesExtraTreeTables(0)
, shapesExtraDictTables(0)
@ -186,10 +188,12 @@ struct CompartmentStats
#if JS_HAS_XML_SUPPORT
, gcHeapXML(other.gcHeapXML)
#endif
, objectSlots(other.objectSlots)
, objectElements(other.objectElements)
, objectMisc(other.objectMisc)
, objectPrivate(other.objectPrivate)
, objectsExtraSlots(other.objectsExtraSlots)
, objectsExtraElements(other.objectsExtraElements)
, objectsExtraArgumentsData(other.objectsExtraArgumentsData)
, objectsExtraRegExpStatics(other.objectsExtraRegExpStatics)
, objectsExtraPropertyIteratorData(other.objectsExtraPropertyIteratorData)
, objectsExtraPrivate(other.objectsExtraPrivate)
, stringCharsNonHuge(other.stringCharsNonHuge)
, shapesExtraTreeTables(other.shapesExtraTreeTables)
, shapesExtraDictTables(other.shapesExtraDictTables)
@ -234,10 +238,12 @@ struct CompartmentStats
size_t gcHeapXML;
#endif
size_t objectSlots;
size_t objectElements;
size_t objectMisc;
size_t objectPrivate;
size_t objectsExtraSlots;
size_t objectsExtraElements;
size_t objectsExtraArgumentsData;
size_t objectsExtraRegExpStatics;
size_t objectsExtraPropertyIteratorData;
size_t objectsExtraPrivate;
size_t stringCharsNonHuge;
size_t shapesExtraTreeTables;
size_t shapesExtraDictTables;
@ -280,10 +286,12 @@ struct CompartmentStats
ADD(gcHeapXML);
#endif
ADD(objectSlots);
ADD(objectElements);
ADD(objectMisc);
ADD(objectPrivate);
ADD(objectsExtraSlots);
ADD(objectsExtraElements);
ADD(objectsExtraArgumentsData);
ADD(objectsExtraRegExpStatics);
ADD(objectsExtraPropertyIteratorData);
ADD(objectsExtraPrivate);
ADD(stringCharsNonHuge);
ADD(shapesExtraTreeTables);
ADD(shapesExtraDictTables);

View File

@ -22,6 +22,13 @@ JSObject::asPropertyIterator()
return *static_cast<js::PropertyIteratorObject *>(this);
}
inline const js::PropertyIteratorObject &
JSObject::asPropertyIterator() const
{
JS_ASSERT(isPropertyIterator());
return *static_cast<const js::PropertyIteratorObject *>(this);
}
js::NativeIterator *
js::PropertyIteratorObject::getNativeIterator() const
{

View File

@ -821,6 +821,12 @@ iterator_iteratorObject(JSContext *cx, HandleObject obj, JSBool keysonly)
return obj;
}
size_t
PropertyIteratorObject::sizeOfMisc(JSMallocSizeOfFun mallocSizeOf) const
{
return mallocSizeOf(getPrivate());
}
void
PropertyIteratorObject::trace(JSTracer *trc, RawObject obj)
{

View File

@ -78,6 +78,8 @@ class PropertyIteratorObject : public JSObject
inline NativeIterator *getNativeIterator() const;
inline void setNativeIterator(js::NativeIterator *ni);
size_t sizeOfMisc(JSMallocSizeOfFun mallocSizeOf) const;
private:
static void trace(JSTracer *trc, RawObject obj);
static void finalize(FreeOp *fop, RawObject obj);

View File

@ -155,19 +155,23 @@ StatsCellCallback(JSRuntime *rt, void *data, void *thing, JSGCTraceKind traceKin
} else {
cStats->gcHeapObjectsOrdinary += thingSize;
}
size_t slotsSize, elementsSize, miscSize;
obj->sizeOfExcludingThis(rtStats->mallocSizeOf, &slotsSize,
&elementsSize, &miscSize);
cStats->objectSlots += slotsSize;
cStats->objectElements += elementsSize;
cStats->objectMisc += miscSize;
size_t slotsSize, elementsSize, argumentsDataSize, regExpStaticsSize,
propertyIteratorDataSize;
obj->sizeOfExcludingThis(rtStats->mallocSizeOf, &slotsSize, &elementsSize,
&argumentsDataSize, &regExpStaticsSize,
&propertyIteratorDataSize);
cStats->objectsExtraSlots += slotsSize;
cStats->objectsExtraElements += elementsSize;
cStats->objectsExtraArgumentsData += argumentsDataSize;
cStats->objectsExtraRegExpStatics += regExpStaticsSize;
cStats->objectsExtraPropertyIteratorData += propertyIteratorDataSize;
if (ObjectPrivateVisitor *opv = closure->opv) {
js::Class *clazz = js::GetObjectClass(obj);
if (clazz->flags & JSCLASS_HAS_PRIVATE &&
clazz->flags & JSCLASS_PRIVATE_IS_NSISUPPORTS)
{
cStats->objectPrivate += opv->sizeOfIncludingThis(GetObjectPrivate(obj));
cStats->objectsExtraPrivate += opv->sizeOfIncludingThis(GetObjectPrivate(obj));
}
}
break;

View File

@ -368,9 +368,10 @@ struct JSObject : public js::ObjectImpl
inline size_t computedSizeOfThisSlotsElements() const;
inline void sizeOfExcludingThis(JSMallocSizeOfFun mallocSizeOf,
size_t *slotsSize, size_t *elementsSize,
size_t *miscSize) const;
inline void sizeOfExcludingThis(JSMallocSizeOfFun mallocSizeOf, size_t *slotsSize,
size_t *elementsSize, size_t *argumentsDataSize,
size_t *regExpStaticsSize,
size_t *propertyIteratorDataSize) const;
bool hasIdempotentProtoChain() const;
@ -1020,6 +1021,7 @@ struct JSObject : public js::ObjectImpl
inline js::NormalArgumentsObject &asNormalArguments();
inline js::NumberObject &asNumber();
inline js::PropertyIteratorObject &asPropertyIterator();
inline const js::PropertyIteratorObject &asPropertyIterator() const;
inline js::RegExpObject &asRegExp();
inline js::ScopeObject &asScope();
inline js::SetObject &asSet();

View File

@ -27,6 +27,7 @@
#include "jswrapper.h"
#include "builtin/MapObject.h"
#include "builtin/Iterator-inl.h"
#include "gc/Barrier.h"
#include "gc/Marking.h"
#include "gc/Root.h"
@ -989,9 +990,9 @@ JSObject::computedSizeOfThisSlotsElements() const
}
inline void
JSObject::sizeOfExcludingThis(JSMallocSizeOfFun mallocSizeOf,
size_t *slotsSize, size_t *elementsSize,
size_t *miscSize) const
JSObject::sizeOfExcludingThis(JSMallocSizeOfFun mallocSizeOf, size_t *slotsSize,
size_t *elementsSize, size_t *argumentsDataSize,
size_t *regExpStaticsSize, size_t *propertyIteratorDataSize) const
{
*slotsSize = 0;
if (hasDynamicSlots()) {
@ -1004,11 +1005,15 @@ JSObject::sizeOfExcludingThis(JSMallocSizeOfFun mallocSizeOf,
}
/* Other things may be measured in the future if DMD indicates it is worthwhile. */
*miscSize = 0;
*argumentsDataSize = 0;
*regExpStaticsSize = 0;
*propertyIteratorDataSize = 0;
if (isArguments()) {
*miscSize += asArguments().sizeOfMisc(mallocSizeOf);
*argumentsDataSize += asArguments().sizeOfMisc(mallocSizeOf);
} else if (isRegExpStatics()) {
*miscSize += js::SizeOfRegExpStaticsData(this, mallocSizeOf);
*regExpStaticsSize += js::SizeOfRegExpStaticsData(this, mallocSizeOf);
} else if (isPropertyIterator()) {
*propertyIteratorDataSize += asPropertyIterator().sizeOfMisc(mallocSizeOf);
}
}

View File

@ -1559,30 +1559,38 @@ ReportCompartmentStats(const JS::CompartmentStats &cStats,
"heap that holds E4X XML objects.");
#endif
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/slots"),
cStats.objectSlots,
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects-extra/slots"),
cStats.objectsExtraSlots,
"Memory allocated for the non-fixed object "
"slot arrays, which are used to represent object properties. "
"Some objects also contain a fixed number of slots which are "
"stored on the JavaScript heap; those slots "
"are not counted here, but in 'gc-heap/objects' instead.");
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/elements"),
cStats.objectElements,
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects-extra/elements"),
cStats.objectsExtraElements,
"Memory allocated for object element "
"arrays, which are used to represent indexed object "
"properties.");
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/misc"),
cStats.objectMisc,
"Memory allocated for various small, miscellaneous "
"structures that hang off certain kinds of objects.");
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects-extra/arguments-data"),
cStats.objectsExtraArgumentsData,
"Memory allocated for data belonging to arguments objects.");
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects-extra/regexp-statics"),
cStats.objectsExtraRegExpStatics,
"Memory allocated for data belonging to the RegExpStatics object.");
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects-extra/property-iterator-data"),
cStats.objectsExtraPropertyIteratorData,
"Memory allocated for data belonging to property iterator "
"objects.");
// Note that we use cDOMPathPrefix here. This is because we measure orphan
// DOM nodes in the JS multi-reporter, but we want to report them in a
// "dom" sub-tree rather than a "js" sub-tree.
CREPORT_BYTES(cDOMPathPrefix + NS_LITERAL_CSTRING("orphan-nodes"),
cStats.objectPrivate,
cStats.objectsExtraPrivate,
"Memory used by orphan DOM nodes that are only reachable "
"from JavaScript objects.");