(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