mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime,runtime/metrics: add heap object count metric
For #37112. Change-Id: Idd3dd5c84215ddd1ab05c2e76e848aa0a4d40fb0 Reviewed-on: https://go-review.googlesource.com/c/go/+/247043 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
74e566ed1d
commit
07c3f65d53
4 changed files with 26 additions and 2 deletions
|
|
@ -38,6 +38,13 @@ func initMetrics() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
metrics = map[string]metricData{
|
metrics = map[string]metricData{
|
||||||
|
"/gc/heap/objects:objects": {
|
||||||
|
deps: makeStatDepSet(heapStatsDep),
|
||||||
|
compute: func(in *statAggregate, out *metricValue) {
|
||||||
|
out.kind = metricKindUint64
|
||||||
|
out.scalar = in.heapStats.numObjects
|
||||||
|
},
|
||||||
|
},
|
||||||
"/memory/classes/heap/free:bytes": {
|
"/memory/classes/heap/free:bytes": {
|
||||||
deps: makeStatDepSet(heapStatsDep),
|
deps: makeStatDepSet(heapStatsDep),
|
||||||
compute: func(in *statAggregate, out *metricValue) {
|
compute: func(in *statAggregate, out *metricValue) {
|
||||||
|
|
@ -210,9 +217,13 @@ func (s *statDepSet) has(d statDep) bool {
|
||||||
type heapStatsAggregate struct {
|
type heapStatsAggregate struct {
|
||||||
heapStatsDelta
|
heapStatsDelta
|
||||||
|
|
||||||
|
// Derived from values in heapStatsDelta.
|
||||||
|
|
||||||
// inObjects is the bytes of memory occupied by objects,
|
// inObjects is the bytes of memory occupied by objects,
|
||||||
// derived from other values in heapStats.
|
|
||||||
inObjects uint64
|
inObjects uint64
|
||||||
|
|
||||||
|
// numObjects is the number of live objects in the heap.
|
||||||
|
numObjects uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
// compute populates the heapStatsAggregate with values from the runtime.
|
// compute populates the heapStatsAggregate with values from the runtime.
|
||||||
|
|
@ -221,8 +232,11 @@ func (a *heapStatsAggregate) compute() {
|
||||||
|
|
||||||
// Calculate derived stats.
|
// Calculate derived stats.
|
||||||
a.inObjects = uint64(a.largeAlloc - a.largeFree)
|
a.inObjects = uint64(a.largeAlloc - a.largeFree)
|
||||||
|
a.numObjects = uint64(a.largeAllocCount - a.largeFreeCount)
|
||||||
for i := range a.smallAllocCount {
|
for i := range a.smallAllocCount {
|
||||||
a.inObjects += uint64(a.smallAllocCount[i]-a.smallFreeCount[i]) * uint64(class_to_size[i])
|
n := uint64(a.smallAllocCount[i] - a.smallFreeCount[i])
|
||||||
|
a.inObjects += n * uint64(class_to_size[i])
|
||||||
|
a.numObjects += n
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,11 @@ type Description struct {
|
||||||
// The English language descriptions below must be kept in sync with the
|
// The English language descriptions below must be kept in sync with the
|
||||||
// descriptions of each metric in doc.go.
|
// descriptions of each metric in doc.go.
|
||||||
var allDesc = []Description{
|
var allDesc = []Description{
|
||||||
|
{
|
||||||
|
Name: "/gc/heap/objects:objects",
|
||||||
|
Description: "Number of objects, live or unswept, occupying heap memory.",
|
||||||
|
Kind: KindUint64,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "/memory/classes/heap/free:bytes",
|
Name: "/memory/classes/heap/free:bytes",
|
||||||
Description: "Memory that is available for allocation, and may be returned to the underlying system.",
|
Description: "Memory that is available for allocation, and may be returned to the underlying system.",
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,9 @@ the documentation of the Name field of the Description struct.
|
||||||
|
|
||||||
Supported metrics
|
Supported metrics
|
||||||
|
|
||||||
|
/gc/heap/objects:objects
|
||||||
|
Number of objects, live or unswept, occupying heap memory.
|
||||||
|
|
||||||
/memory/classes/heap/free:bytes
|
/memory/classes/heap/free:bytes
|
||||||
Memory that is available for allocation, and may be returned
|
Memory that is available for allocation, and may be returned
|
||||||
to the underlying system.
|
to the underlying system.
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,8 @@ func TestReadMetrics(t *testing.T) {
|
||||||
checkUint64(t, name, samples[i].Value.Uint64(), mstats.BuckHashSys)
|
checkUint64(t, name, samples[i].Value.Uint64(), mstats.BuckHashSys)
|
||||||
case "/memory/classes/total:bytes":
|
case "/memory/classes/total:bytes":
|
||||||
checkUint64(t, name, samples[i].Value.Uint64(), mstats.Sys)
|
checkUint64(t, name, samples[i].Value.Uint64(), mstats.Sys)
|
||||||
|
case "/gc/heap/objects:objects":
|
||||||
|
checkUint64(t, name, samples[i].Value.Uint64(), mstats.HeapObjects)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue