如何准确跟踪内存使用情况?

时间:2017-01-31 15:58:09

标签: go memory-leaks

我正在尝试构建一个小工具,允许我运行程序并通过Go跟踪内存使用情况。我使用r.exec = exec.Command(r.Command, r.CommandArgs...)来运行命令,并使用runtime.MemStats来跟踪内存使用情况(在单独的go例程中):

func monitorRuntime() {
    m := &runtime.MemStats{}
    f, err := os.Create(fmt.Sprintf("mmem_%s.csv", getFileTimeStamp()))
    if err != nil {
        panic(err)
    }
    f.WriteString("Time;Allocated;Total Allocated; System Memory;Num Gc;Heap Allocated;Heap System;Heap Objects;Heap Released;\n")
    for {
        runtime.ReadMemStats(m)
        f.WriteString(fmt.Sprintf("%s;%d;%d;%d;%d;%d;%d;%d;%d;\n", getTimeStamp(), m.Alloc, m.TotalAlloc, m.Sys, m.NumGC, m.HeapAlloc, m.HeapSys, m.HeapObjects, m.HeapReleased))
        time.Sleep(5 * time.Second)
    }
}

当我用简单的程序测试我的代码时(大约12个小时),我注意到Go不断分配更多的内存: System Memory Heap Allocation

我做了一些测试,比如在没有任何其他代码的情况下运行monitorRuntime()函数,或者使用pprof,例如:

package main

import (
    "net/http"
    _ "net/http/pprof"
)

func main() {
    http.ListenAndServe(":8080", nil)
}

然而我仍然注意到内存分配就像图中一样持续上升。

如何准确跟踪我想要运行的程序的内存使用量? 我知道我过去使用的一种方法是使用/proc/$PID/statm,但该文件并不存在于每个操作系统(例如Mac OS或Windows)中

1 个答案:

答案 0 :(得分:0)

在Linux(RedHat)上,以下内容将显示内存使用情况: ps -No pid,comm,size,vsize,args:90