• 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
  • 相关阅读:
    这里已不再更新,访问新博客请移步 http://www.douruixin.com
    Javaweb学习笔记10—文件上传与下载
    Javaweb学习笔记9—过滤器
    Javaweb学习笔记8—DBUtils工具包
    Javaweb学习笔记7—JDBC技术
    Javaweb学习笔记6—EL表达式与JSTL及自定义标签
    Javaweb学习笔记5—Cookie&Session
    Javaweb学习笔记4—Reuest&Response
    Javaweb学习笔记3—Serverlet
    Javaweb学习笔记2—Tomcat和http协议
  • 原文地址:https://www.cnblogs.com/peteremperor/p/13650892.html
Copyright © 2020-2023  润新知