go oom堆内存分析

复制代码
 go tool pprof http://localhost:6060/debug/pprof/heap

执行top命令

分析

go tool pprof 的输出结果来看,我们可以分析内存占用的热点和可能的内存问题。以下是分析结果:


输出解读

  • flat:表示当前函数直接分配的内存大小(不包括它调用的其他函数的内存)。
  • flat%flat 占总内存分配的百分比。
  • cum:当前函数及其调用链的总内存分配。
  • cum%cum 占总内存分配的百分比。

前 10 个内存热点如下:

函数名 直接内存 (flat) 总内存 (cum) flat% cum%
runtime.malg 146.56 MB 146.56 MB 56.93% 56.93%
fmt.init.func1 66.01 MB 66.01 MB 25.64% 25.64%
internal/poll.runtime_Semacquire 24.50 MB 24.50 MB 9.52% 9.52%
golang.org/x/net/webdav.(*memFile).Write 7.89 MB 7.89 MB 3.06% 3.06%
time.Sleep 4 MB 4 MB 1.55% 1.55%
runtime.allgadd 2.84 MB 2.84 MB 1.10% 1.10%
gindemo/pkg/controller/student.Oom.func1 1.50 MB 97.02 MB 0.58% 37.69%
fmt.Fprintln 0 MB 91.52 MB 0% 35.55%
fmt.Println (inline) 0 MB 91.52 MB 0% 35.55%
fmt.newPrinter 0 MB 66.01 MB 0% 25.64%

问题分析

  1. runtime.malg

    • runtime.malg 是 Go runtime 为 Goroutine 分配栈内存的函数。
    • 占用了 146.56MB (56.93%) 的内存,这说明程序可能创建了大量 Goroutine,每个 Goroutine 默认分配 2KB 的栈空间。
    • 问题可能原因
      • Goroutine 使用不当,比如进入死循环或 Goroutine 泄漏。
      • 某些操作频繁创建 Goroutine,而没有释放。
  2. fmt.init.func1

    • fmt.init.func1 占用了 66.01MB (25.64%) 的内存,这通常和 fmt 包的初始化有关。
    • 问题可能原因
      • 程序中过度使用 fmt.Printlnfmt.Sprintf 等方法,导致分配了大量字符串。
      • 注意调用链中有 fmt.Printlnfmt.Fprintln,两者累积占用了 91.52MB (35.55%) 的内存。
  3. internal/poll.runtime_Semacquire

    • 占用了 24.50MB (9.52%) 的内存,这通常和系统 I/O 操作或锁竞争有关。
    • 问题可能原因
      • 某些操作在等待资源(如文件、网络连接或锁),未能释放。
      • 检查程序是否有阻塞的 I/O 或锁使用问题。
  4. golang.org/x/net/webdav.(*memFile).Write

    • 占用了 7.89MB (3.06%) 的内存,这说明 WebDAV 的 Write 操作分配了一些临时内存。
    • 问题可能原因
      • 如果 Write 被频繁调用,可能导致内存分配累积。
      • 检查 WebDAV 文件操作是否可以优化。
  5. gindemo/pkg/controller/student.Oom.func1

    • 该函数总共占用了 97.02MB (37.69%) 的内存(cum%)。
    • 问题可能原因
      • 函数中可能存在大量内存分配,或频繁调用其他内存热点函数(如 fmt.Println)。
      • 需要进一步定位 student.Oom.func1 的具体实现逻辑。
相关推荐
过期动态2 分钟前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
皓月斯语30 分钟前
程序设计语言的特点
开发语言·数据结构·c++
超人不会飞_Jay34 分钟前
Go课程2
开发语言·后端·golang
刘小八38 分钟前
Spring AI Tool Calling 生产化:参数校验、权限控制与超时隔离
java·人工智能·spring
奶糖 肥晨1 小时前
一次Spring Boot编译报错排查:三元运算符与包装类型的“隐形陷阱”
java·spring boot·后端
谢栋_1 小时前
设计模式从入门到精通之(七)责任链模式
java·设计模式·责任链模式
Billy121381 小时前
结构化绑定与 if constexpr
开发语言·c++进阶学习
愚公移码1 小时前
蓝凌EKP18产品:核心执行流程
java·流程引擎
VortMall1 小时前
全维度打磨细节体验,赋能商城稳定有序运营|VortMall 微服务商城 v1.3.11 版本发布
java·微服务·云原生·架构·商城系统·开源商城·vortmall
Tirzano1 小时前
java 精简使用ffmpeg
java·开发语言·ffmpeg