(1)内存的占⽤情况 top -p $(pidof 进程名) 查看某个进程的内存占⽤情况
mem 内存的总体情况
free 空闲内存
used 目前占用情况
(2)GODEBUG和gctrace来分析golang程序的内存使用情况
GODEBUG='gctrace=1' ./test2_Mem
输出的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的属性来查看信息
1、Alloc uint64 //golang语⾔框架堆空间分配的字节数 2、TotalAlloc uint64 //从服务开始运⾏⾄今分配器为分配的堆空间总 和,只有增加,释放的时候不减少 3、Sys uint64 //服务现在系统使⽤的内存 4、Lookups uint64 //被runtime监视的指针数 5、Mallocs uint64 //服务malloc heap objects的次数 6、Frees uint64 //服务回收的heap objects的次数 7、HeapAlloc uint64 //服务分配的堆内存字节数 8、HeapSys uint64 //系统分配的作为运⾏栈的内存 9、HeapIdle uint64 //申请但是未分配的堆内存或者回收了的堆内存(空闲)字节数 10、HeapInuse uint64 //正在使⽤的堆内存字节数 10、HeapReleased uint64 //返回给OS的堆内存,类似C/C++中的free。 11、HeapObjects uint64 //堆内存块申请的量 12、StackInuse uint64 //正在使⽤的栈字节数 13、StackSys uint64 //系统分配的作为运⾏栈的内存 14、MSpanInuse uint64 //⽤于测试⽤的结构体使⽤的字节数 15、MSpanSys uint64 //系统为测试⽤的结构体分配的字节数 16、MCacheInuse uint64 //mcache结构体申请的字节数(不会被视为垃圾回收) 17、MCacheSys uint64 //操作系统申请的堆空间⽤于mcache的字节数 18、BuckHashSys uint64 //⽤于剖析桶散列表的堆空间 19、GCSys uint64 //垃圾回收标记元信息使⽤的内存 20、OtherSys uint64 //golang系统架构占⽤的额外空间 21、NextGC uint64 //垃圾回收器检视的内存⼤⼩ 22、LastGC uint64 // 垃圾回收器最后⼀次执⾏时间。 23、PauseTotalNs uint64 // 垃圾回收或者其他信息收集导致服务暂停的次数。 24、PauseNs [256]uint64 //⼀个循环队列,记录最近垃圾回收系统中断的时间 25、PauseEnd [256]uint64 //⼀个循环队列,记录最近垃圾回收系统中断的时间开始点。 26、NumForcedGC uint32 //服务调⽤runtime.GC()强制使⽤垃圾回收的次数。 27、GCCPUFraction float64 //垃圾回收占⽤服务CPU⼯作的时间总和。如果有100个goroutine,垃圾回收的时间为1S,那么就占⽤了 100S。 28、BySize //内存分配器使⽤情况
(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
# runtime.MemStats # Alloc = 158224 # TotalAlloc = 1293587304 # Sys = 1181335936 # Lookups = 0 # Mallocs = 972 # Frees = 212 # HeapAlloc = 158224 # HeapSys = 1140457472 # HeapIdle = 1139736576 # HeapInuse = 720896 # HeapReleased = 541925376 # HeapObjects = 760 # Stack = 393216 / 393216 # MSpan = 28288 / 32768 # MCache = 3472 / 16384 # BuckHashSys = 1449825 # GCSys = 38209928 # OtherSys = 776343 # NextGC = 4194304 # LastGC = 1586452032967855804