golang 程序內存分析方法


(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM