page contents

golang 程序内存解析方法

golang 程序内存分析方法

attachments-2021-09-64T5kEtJ61380ed80dbf8.jpg

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

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

程序员编程交流QQ群:805358732

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-Z9ozw40H62afdf39e11a2.jpeg

  • 发表于 2021-09-08 09:16
  • 阅读 ( 532 )
  • 分类:Golang

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章