在住宅记忆稳步增长的同时,使用内存不足

时间:2017-01-02 19:17:09

标签: 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.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 不解释为什么内存会继续增加(并且不会被重用)。

0 个答案:

没有答案