我在Go中编写一个依赖于regexp的程序。 htop中显示的内存使用量稳步增加到程序崩溃的程度。 (> 5-7GB)
然而,当我用pprof分析内存使用情况时,它告诉我实际上只有一小部分在使用。 (〜70MB)
我尝试手动触发GC:
go func() {
for range time.Tick(30*time.Second){
runtime.GC()
debug.FreeOSMemory()
runtime.ReadMemStats(&m)
fmt.Printf("HeapSys: %d, HeapAlloc: %d, HeapIdle: %d, HeapReleased: %d\n", m.HeapSys, m.HeapAlloc,
m.HeapIdle, m.HeapReleased)
}}()
// Sample output(not from the same run as the other numbers):
// HeapSys: 347308032, HeapAlloc: 123637792, HeapIdle: 194322432, HeapReleased: 0
这显示没有效果。 我的理解是golang只需要内存,如果它需要更多并且每隔一段时间清理一次(使用GCTRACE运行表明gc实际上经常运行) 我不明白为什么当实际使用的内存相对较小时,golang会继续请求内存。
有人知道差距的根本原因以及我如何阻止我的程序吃内存?
由于图表是SVG,我无法嵌入它们:
可能相关: how to analyse golang memory 不解释为什么内存会继续增加(并且不会被重用)。