(1)内存的占⽤情况 top -p $(pidof 进程名) 查看某个进程的内存占⽤情况

         mem 内存的总体情况

         free 空闲内存

         used 目前占用情况

(2)GODEBUG和gctrace来分析golang程序的内存使用情况

 输出的GC数据 gc 17 @0.512s 2%: 0.003+33+0.003 ms clock, 0.007+0/0.053/33+0.007 ms cpu, 181->181->101 MB, 182 MB goal, 2 P

数据中每个的字段含义:

  gc 17 表示GC回收的次数编号,递增

  @0.512s 当前程序已经执⾏了0.512s

  2% 0.512s中其中gc模块占⽤了2%的时间

  0.003+33+0.003 ms clock 垃圾回收的时间,分别为STW(Stop the world)的时间+并发标记的时间+STW标记的时间

  0.007+0/0.053/33+0.007 ms cpu 垃圾回收占⽤的CPU时间

  181->181->101 MB GC开始前堆内存181MB->GC结束后堆内存的181MB->当前的活跃的堆内存101MB

  182 MB goal 全局堆内存的⼤⼩

  2 P 本次GC使⽤了2个P(调度器中的Processer)

两次回收过程:

将444MB活跃的内存标记为⾮活跃内存, 全局堆内存增加到888MB gc 21 @0.465s 0%: 0.004+0.12+0.003 ms clock, 0.009+0/0.017/0.064+0.006 ms cpu, 444->444->0 MB, 888 MB goal, 2 P (forced)

将888MB的垃圾内存,全部的清除掉 gc 22 @121.396s 0%: 0.007+0.090+0.002 ms clock, 0.014+0/0.025/0.084+0.005 ms cpu, 0->0->0 MB, 4 MB goal, 2 P

(3)runtime.MemStats调试当前 golang程序内存的占⽤情况

在代码中定义runtime.MemStats 对象来查看

    runtime.ReadMemStats(&ms) 将当前的内存状态,加载到ms对象中

        访问Ms的属性来查看信息

(4)pprof分析golang内存

import “net/http/pprof”

在被调试的程序中,提供⼀个 web端⼝ 在main函数中添加⼀个端⼝监听 http.ListenAndServe("0.0.0.0:10000", nil)

通过浏览器⽹⻚来查看内存的信息和状态 http://127.0.0.1:10000/debug/pprof/heap?debug=1