mirror of https://github.com/golang/go.git
runtime: remove memstats.heap_idle
This statistic is updated in many places but for MemStats may be computed from existing statistics. Specifically by definition heap_idle = heap_sys - heap_inuse since heap_sys is all memory allocated from the OS for use in the heap minus memory used for non-heap purposes. heap_idle is almost the same (since it explicitly includes memory that *could* be used for non-heap purposes) but also doesn't include memory that's actually used to hold heap objects. Although it has some utility as a sanity check, it complicates accounting and we want fewer, orthogonal statistics for upcoming metrics changes, so just drop it. Change-Id: I40af54a38e335f43249f6e218f35088bfd4380d1 Reviewed-on: https://go-review.googlesource.com/c/go/+/246974 Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Michael Knyszek <mknyszek@google.com> Reviewed-by: Michael Pratt <mpratt@google.com>
This commit is contained in:
parent
ad863ba32a
commit
c5dea8f387
|
|
@ -552,7 +552,7 @@ func dumpmemstats() {
|
||||||
dumpint(memstats.nfree)
|
dumpint(memstats.nfree)
|
||||||
dumpint(memstats.heap_alloc)
|
dumpint(memstats.heap_alloc)
|
||||||
dumpint(memstats.heap_sys.load())
|
dumpint(memstats.heap_sys.load())
|
||||||
dumpint(memstats.heap_idle)
|
dumpint(memstats.heap_sys.load() - memstats.heap_inuse)
|
||||||
dumpint(memstats.heap_inuse)
|
dumpint(memstats.heap_inuse)
|
||||||
dumpint(memstats.heap_released)
|
dumpint(memstats.heap_released)
|
||||||
dumpint(memstats.heap_objects)
|
dumpint(memstats.heap_objects)
|
||||||
|
|
|
||||||
|
|
@ -1239,7 +1239,6 @@ HaveSpan:
|
||||||
// Manually managed memory doesn't count toward heap_sys.
|
// Manually managed memory doesn't count toward heap_sys.
|
||||||
memstats.heap_sys.add(-int64(nbytes))
|
memstats.heap_sys.add(-int64(nbytes))
|
||||||
}
|
}
|
||||||
atomic.Xadd64(&memstats.heap_idle, -int64(nbytes))
|
|
||||||
|
|
||||||
// Publish the span in various locations.
|
// Publish the span in various locations.
|
||||||
|
|
||||||
|
|
@ -1317,7 +1316,6 @@ func (h *mheap) grow(npage uintptr) bool {
|
||||||
// size which is always > physPageSize, so its safe to
|
// size which is always > physPageSize, so its safe to
|
||||||
// just add directly to heap_released.
|
// just add directly to heap_released.
|
||||||
atomic.Xadd64(&memstats.heap_released, int64(asize))
|
atomic.Xadd64(&memstats.heap_released, int64(asize))
|
||||||
atomic.Xadd64(&memstats.heap_idle, int64(asize))
|
|
||||||
|
|
||||||
// Recalculate nBase.
|
// Recalculate nBase.
|
||||||
// We know this won't overflow, because sysAlloc returned
|
// We know this won't overflow, because sysAlloc returned
|
||||||
|
|
@ -1417,7 +1415,6 @@ func (h *mheap) freeSpanLocked(s *mspan, typ spanAllocType) {
|
||||||
// Manually managed memory doesn't count toward heap_sys, so add it back.
|
// Manually managed memory doesn't count toward heap_sys, so add it back.
|
||||||
memstats.heap_sys.add(int64(nbytes))
|
memstats.heap_sys.add(int64(nbytes))
|
||||||
}
|
}
|
||||||
atomic.Xadd64(&memstats.heap_idle, int64(nbytes))
|
|
||||||
|
|
||||||
// Mark the space as free.
|
// Mark the space as free.
|
||||||
h.pages.free(s.base(), s.npages)
|
h.pages.free(s.base(), s.npages)
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,6 @@ type mstats struct {
|
||||||
// in manually-managed spans.
|
// in manually-managed spans.
|
||||||
heap_alloc uint64 // bytes allocated and not yet freed (same as alloc above)
|
heap_alloc uint64 // bytes allocated and not yet freed (same as alloc above)
|
||||||
heap_sys sysMemStat // virtual address space obtained from system for GC'd heap
|
heap_sys sysMemStat // virtual address space obtained from system for GC'd heap
|
||||||
heap_idle uint64 // bytes in idle spans
|
|
||||||
heap_inuse uint64 // bytes in mSpanInUse spans
|
heap_inuse uint64 // bytes in mSpanInUse spans
|
||||||
heap_released uint64 // bytes released to the os
|
heap_released uint64 // bytes released to the os
|
||||||
|
|
||||||
|
|
@ -461,7 +460,23 @@ func readmemstats_m(stats *MemStats) {
|
||||||
stats.Frees = memstats.nfree
|
stats.Frees = memstats.nfree
|
||||||
stats.HeapAlloc = memstats.heap_alloc
|
stats.HeapAlloc = memstats.heap_alloc
|
||||||
stats.HeapSys = memstats.heap_sys.load()
|
stats.HeapSys = memstats.heap_sys.load()
|
||||||
stats.HeapIdle = memstats.heap_idle
|
// By definition, HeapIdle is memory that was mapped
|
||||||
|
// for the heap but is not currently used to hold heap
|
||||||
|
// objects. It also specifically is memory that can be
|
||||||
|
// used for other purposes, like stacks, but this memory
|
||||||
|
// is subtracted out of HeapSys before it makes that
|
||||||
|
// transition. Put another way:
|
||||||
|
//
|
||||||
|
// heap_sys = bytes allocated from the OS for the heap - bytes ultimately used for non-heap purposes
|
||||||
|
// heap_idle = bytes allocated from the OS for the heap - bytes ultimately used for any purpose
|
||||||
|
//
|
||||||
|
// or
|
||||||
|
//
|
||||||
|
// heap_sys = sys - stacks_inuse - gcWorkBufInUse - gcProgPtrScalarBitsInUse
|
||||||
|
// heap_idle = sys - stacks_inuse - gcWorkBufInUse - gcProgPtrScalarBitsInUse - heap_inuse
|
||||||
|
//
|
||||||
|
// => heap_idle = heap_sys - heap_inuse
|
||||||
|
stats.HeapIdle = memstats.heap_sys.load() - memstats.heap_inuse
|
||||||
stats.HeapInuse = memstats.heap_inuse
|
stats.HeapInuse = memstats.heap_inuse
|
||||||
stats.HeapReleased = memstats.heap_released
|
stats.HeapReleased = memstats.heap_released
|
||||||
stats.HeapObjects = memstats.heap_objects
|
stats.HeapObjects = memstats.heap_objects
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue