【发布时间】:2022-01-14 00:24:06
【问题描述】:
我正在尝试测量在调用函数之前和之后堆分配对象数量的演变。我正在强制 runtime.GC() 并使用 runtime.ReadMemStats 来测量我之前和之后拥有的堆对象的数量。
我遇到的问题是我有时会看到意外的堆增长。而且每次跑完都不一样。
下面是一个简单的例子,我总是希望看到零堆对象增长。
https://go.dev/play/p/FBWfXQHClaG
var mem1_before, mem2_before, mem1_after, mem2_after runtime.MemStats
func measure_nothing(before, after *runtime.MemStats) {
runtime.GC()
runtime.ReadMemStats(before)
runtime.GC()
runtime.ReadMemStats(after)
}
func main() {
measure_nothing(&mem1_before, &mem1_after)
measure_nothing(&mem2_before, &mem2_after)
log.Printf("HeapObjects diff = %d", int64(mem1_after.HeapObjects-mem1_before.HeapObjects))
log.Printf("HeapAlloc diff %d", int64(mem1_after.HeapAlloc-mem1_before.HeapAlloc))
log.Printf("HeapObjects diff = %d", int64(mem2_after.HeapObjects-mem2_before.HeapObjects))
log.Printf("HeapAlloc diff %d", int64(mem2_after.HeapAlloc-mem2_before.HeapAlloc))
}
样本输出:
2009/11/10 23:00:00 HeapObjects diff = 0
2009/11/10 23:00:00 HeapAlloc diff 0
2009/11/10 23:00:00 HeapObjects diff = 4
2009/11/10 23:00:00 HeapAlloc diff 1864
我正在尝试做的事情不切实际吗?我假设运行时正在做分配/释放堆内存的事情。我可以告诉它停止测量吗? (这是用于检查内存泄漏的测试,而不是生产代码)
【问题讨论】:
-
你为什么不使用测试框架来衡量这个?基准测试报告分配/操作以及字节/操作,将它们相乘以获得堆差异。
标签: go heap-memory