Go 在住宅内存稳步增长的同时,使用低内存

Go 在住宅内存稳步增长的同时,使用低内存,go,garbage-collection,pprof,Go,Garbage Collection,Pprof,我正在用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.Pr

我正在用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,我无法嵌入它们:

  • 占用空间(可接受的内存使用量)
  • 分配空间(通常称为分配大量内存的正则表达式)
可能相关:
无法解释内存继续增加(且无法重用)的原因。

在某种意义上,唯一可以“泄漏”的是不返回的goroutine。查看堆栈跟踪以查看正在运行的内容。@JimB谢谢您的提示。我现在对整个代码进行了重构,使其始终有固定数量的工人与(缓冲)队列通信。这已经停止了失控的内存消耗。