diff --git a/src/runtime/gc_blocks.go b/src/runtime/gc_blocks.go index a95edbfd0d..a10b594375 100644 --- a/src/runtime/gc_blocks.go +++ b/src/runtime/gc_blocks.go @@ -827,6 +827,7 @@ func ReadMemStats(m *MemStats) { liveBytes := uint64(liveBlocks * bytesPerBlock) m.HeapInuse = liveBytes m.HeapAlloc = liveBytes + m.HeapObjects = uint64(liveHeads) m.Alloc = liveBytes // Subtract live blocks from total blocks to count free blocks. diff --git a/src/runtime/gc_leaking.go b/src/runtime/gc_leaking.go index b60fff1045..24eea44bb7 100644 --- a/src/runtime/gc_leaking.go +++ b/src/runtime/gc_leaking.go @@ -96,6 +96,7 @@ func ReadMemStats(m *MemStats) { m.Sys = uint64(heapEnd - heapStart) // no free -- current in use heap is the total allocated m.HeapAlloc = gcTotalAlloc + m.HeapObjects = gcMallocs m.Alloc = m.HeapAlloc gcLock.Unlock() diff --git a/src/runtime/mstats.go b/src/runtime/mstats.go index 7a6f8e637f..987e17c30c 100644 --- a/src/runtime/mstats.go +++ b/src/runtime/mstats.go @@ -53,6 +53,13 @@ type MemStats struct { // HeapReleased is bytes of physical memory returned to the OS. HeapReleased uint64 + // HeapObjects is the number of allocated heap objects. + // + // Like HeapAlloc, this increases as objects are allocated and + // decreases as the heap is swept and unreachable objects are + // freed. + HeapObjects uint64 + // TotalAlloc is cumulative bytes allocated for heap objects. // // TotalAlloc increases as heap objects are allocated, but