diff --git a/js/public/MemoryMetrics.h b/js/public/MemoryMetrics.h index 2a5d4517e38..fb74b260b31 100644 --- a/js/public/MemoryMetrics.h +++ b/js/public/MemoryMetrics.h @@ -214,6 +214,7 @@ struct GCSizes { #define FOR_EACH_SIZE(macro) \ macro(_, _, marker) \ + macro(_, _, nursery) \ macro(_, _, storeBufferVals) \ macro(_, _, storeBufferCells) \ macro(_, _, storeBufferSlots) \ diff --git a/js/src/gc/Nursery.h b/js/src/gc/Nursery.h index 524ba30c1fc..9f0310abb83 100644 --- a/js/src/gc/Nursery.h +++ b/js/src/gc/Nursery.h @@ -123,6 +123,8 @@ class Nursery /* Forward a slots/elements pointer stored in an Ion frame. */ void forwardBufferPointer(HeapSlot **pSlotsElems); + size_t sizeOfHeap() { return start() ? NurserySize : 0; } + #ifdef JS_GC_ZEAL /* * In debug and zeal builds, these bytes indicate the state of an unused diff --git a/js/src/vm/Runtime.cpp b/js/src/vm/Runtime.cpp index c1613837768..57ce574e3a7 100644 --- a/js/src/vm/Runtime.cpp +++ b/js/src/vm/Runtime.cpp @@ -624,6 +624,7 @@ JSRuntime::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::Runtim rtSizes->gc.marker += gcMarker.sizeOfExcludingThis(mallocSizeOf); #ifdef JSGC_GENERATIONAL + rtSizes->gc.nursery += gcNursery.sizeOfHeap(); gcStoreBuffer.addSizeOfExcludingThis(mallocSizeOf, &rtSizes->gc); #endif } diff --git a/js/xpconnect/src/XPCJSRuntime.cpp b/js/xpconnect/src/XPCJSRuntime.cpp index 31207c994a7..775b958f65d 100644 --- a/js/xpconnect/src/XPCJSRuntime.cpp +++ b/js/xpconnect/src/XPCJSRuntime.cpp @@ -2308,6 +2308,10 @@ ReportJSRuntimeExplicitTreeStats(const JS::RuntimeStats &rtStats, KIND_HEAP, rtStats.runtime.gc.marker, "Memory used for the GC mark stack and gray roots."); + RREPORT_BYTES(rtPath + NS_LITERAL_CSTRING("runtime/gc/nursery"), + KIND_NONHEAP, rtStats.runtime.gc.nursery, + "Memory used for the GC nursery."); + RREPORT_BYTES(rtPath + NS_LITERAL_CSTRING("runtime/gc/store-buffer/vals"), KIND_HEAP, rtStats.runtime.gc.storeBufferVals, "Memory used for values in the store buffer.");