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
原文地址:https://www.cnblogs.com/peteremperor/p/13650892.html