欢迎访问
我们一直在努力

golang 内存占用信息解读

触发方法:

其中debug参数为2是以高可读的方式提供各活跃Goroutine的状态信息和调用栈信息,更便于理解。

方法一(内容比较少场景适用)
curl http://localhost:8001/debug/pprof/heap?debug=2
# 这个输出信息可以参考下面的解读

方法二(内容比较多场景适用)
# adserver是我的程序名字,需要换成你自己的
scp 10.200.95.17:/opt/zyz/services/bin/adserver ./
# 参数信息见下面“交互式命令”
go tool pprof adserver [-alloc_space|-inuse_space] http://10.200.95.17:8001/debug/pprof/heap?debug=2
# 接下来查看方法参考cpu性能统计方式,是类似的 https://www.vvniu.com/108.html

交互式命令

除了和查看cpu一致的top、list等命令,还有就是查看方式不同。
在使用 pprof 查看内存的时候,通常会用到两个选项。
- alloc_space用于告诉你已经分配了多少内存
- inuse_space用于获得正在使用的内存的数量

信息解读

  • 解读一
# 看第一行的1: 5816320 [1: 5816320],四个数字的含义是当前存活对象的数量、存活对象已经占用的内存、分配的总的数量和所有分配已经占用的内存。
对应于具体代码来讲ip_helper.go:52中对应ipRecords对象,当前占用了582k内存,当前的存活的对象也只有一个,总共分配的对象数量也是1个,总共占用内存也是582k。  
1: 5816320 [1: 5816320] @ 0x443d21 0x46806d 0x468614 0x94cf80 0x78a4b7 0x50f457 0x50a82b 0x466017 0x4019cb 0x42fa2f 0x460f01
#   0x46806d    adserver/util.init.2+0xaed  /home/jiyalei/serving_clean/backend/src/adserver/util/ip_helper.go:52
#   0x468614    adserver/util.init+0xf4     /home/jiyalei/serving_clean/backend/src/adserver/util/ip_helper.go:88
#   0x94cf80    adserver/nctrserver.init+0x40   /home/jiyalei/serving_clean/backend/src/adserver/nctrserver/nctrclient.go:42
#   0x78a4b7    adserver/bidserver.init+0x47    /home/jiyalei/serving_clean/backend/src/adserver/bidserver/spec.go:97
#   0x50f457    adserver/bucket.init+0x47   /home/jiyalei/serving_clean/backend/src/adserver/bucket/util.go:52
#   0x50a82b    adserver/antispam.init+0x3b /home/jiyalei/serving_clean/backend/src/adserver/antispam/antispam.go:201
#   0x466017    adserver/server.init+0x47   /home/jiyalei/serving_clean/backend/src/adserver/server/adserver_handler.go:356
#   0x4019cb    main.init+0x3b          /home/jiyalei/serving_clean/backend/src/adserver/adserver.go:36
#   0x42fa2f    runtime.main+0x27f      /data/opt/go/src/runtime/proc.go:177
  • 解读二
# ip_helper.go:29对应的对象是`line := strings.TrimSuffix(sc.Text(), ";")`读取文件临时生成的内容[]string,其中当前存活了11个,占用内从352字节,总共分配了14个,总共占用内存是448字节。  
11: 352 [14: 448] @ 0x4481c7 0x44804f 0x46787c 0x468614 0x94cf80 0x78a4b7 0x50f457 0x50a82b 0x466017 0x4019cb 0x42fa2f 0x460f01
#   0x46787c    adserver/util.init.2+0x2fc  /home/jiyalei/serving_clean/backend/src/adserver/util/ip_helper.go:29
#   0x468614    adserver/util.init+0xf4     /home/jiyalei/serving_clean/backend/src/adserver/util/ip_helper.go:88
#   0x94cf80    adserver/nctrserver.init+0x40   /home/jiyalei/serving_clean/backend/src/adserver/nctrserver/nctrclient.go:42
#   0x78a4b7    adserver/bidserver.init+0x47    /home/jiyalei/serving_clean/backend/src/adserver/bidserver/spec.go:97
#   0x50f457    adserver/bucket.init+0x47   /home/jiyalei/serving_clean/backend/src/adserver/bucket/util.go:52
#   0x50a82b    adserver/antispam.init+0x3b /home/jiyalei/serving_clean/backend/src/adserver/antispam/antispam.go:201
#   0x466017    adserver/server.init+0x47   /home/jiyalei/serving_clean/backend/src/adserver/server/adserver_handler.go:356
#   0x4019cb    main.init+0x3b          /home/jiyalei/serving_clean/backend/src/adserver/adserver.go:36
#   0x42fa2f    runtime.main+0x27f      /data/opt/go/src/runtime/proc.go:177
  • 解读三
# runtime.MemStats
# Alloc = 232368464  // 系统分配了,并且仍在使用的内存
# TotalAlloc = 515498984 // 分配的内存总量
# Sys = 379609648  // 从系统得到的内存总量
# Lookups = 4230  // 指针索引的次数
# Mallocs = 7106339 // 内存分配的次数
# Frees = 4524688  // 内存释放的次数
# HeapAlloc = 232368464  // 分配了之后,并且仍在使用的堆内存
# HeapSys = 359268352  // 从系统申请的堆内存大小
# HeapIdle = 91168768  // 处于空闲状态的堆占用字节数
# HeapInuse = 268099584  // 正在使用的堆占用字节数
# HeapReleased = 90144768  // 释放到操作系统中的内存
# HeapObjects = 2581651  // 堆中对象总数
# Stack = 655360 / 655360
# MSpan = 3711720 / 3817472
# MCache = 4800 / 16384
# BuckHashSys = 1487382
# NextGC = 447942144  // 当 HeapAlloc大于该值的时候,会进行垃圾回收
# PauseNs = [594480 364145 99762 317118 425105 111577 153365 445907 437152
1338716 485488 300576 580628 1502067 345485 159770 371568 4857962 613538 224786
591615 443425 395232 447163 442450 1626090 669302 473665 8036718 2595428 566280
364149 403823 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]  // 最新的几次gc的停顿时间,最近的一次在[(NumGC+255)%256]
# NumGC = 33  // 总共gc的次数
# EnableGC = true
# DebugGC = false
未经允许不得转载:威威牛 » golang 内存占用信息解读
分享到: 更多 (0)