Golang Go语言中碰到的内存问题

发布于 1周前 作者 itying888 来自 Go语言

通过 linux top 查看到程序占用了 1.8G 内存,但使用 go tool pprof 查看到的只有几 M

go tool  pprof  http://localhost:6060/debug/pprof/heap

(pprof) top Showing nodes accounting for 1.78MB, 100% of 1.78MB total flat flat% sum% cum cum% 1.78MB 100% 100% 1.78MB 100% github.com/mozillazg/go-pinyin.init /root/local/go/src/github.com/mozillazg/go-pinyin/pinyin_dict.go 0 0% 100% 1.78MB 100% _/root/projections/rpc/gox.init <autogenerated> 0 0% 100% 1.78MB 100% main.init <autogenerated> 0 0% 100% 1.78MB 100% runtime.main /root/go/src/runtime/proc.go (pprof)


Golang Go语言中碰到的内存问题

更多关于Golang Go语言中碰到的内存问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

Go 的 virt 占用大是正常的,res 比较接近实际

更多关于Golang Go语言中碰到的内存问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


就是 res=1.8G

问题是什么呢

问题比较具体,不太好说

如果碰到相似情况,可以参考 google forum 那篇,是具体解释 pprof/heap 里的字段含义

还有这篇,具体讲 profile 过程
https://github.com/bradfitz/talk-yapc-asia-2015/blob/master/talk.md

在Go语言中遇到内存问题,通常涉及内存泄漏、内存分配不当或垃圾回收效率低下等方面。以下是一些常见的排查和解决策略:

  1. 内存泄漏

    • 使用pprof工具进行内存分析,查找内存分配热点和未释放的内存。
    • 检查是否有全局变量或闭包中引用了大量数据,导致数据无法被垃圾回收。
    • 注意goroutine的生命周期,避免长时间运行的goroutine持有不必要的内存。
  2. 内存分配不当

    • 优化数据结构,选择合适的数据类型(如slice、map等),以减少内存占用。
    • 避免不必要的内存复制,使用指针传递大型数据结构。
    • 适时清理不再使用的数据,减少内存占用。
  3. 垃圾回收效率低下

    • 调整垃圾回收参数(如GOGC),以适应应用的工作负载。
    • 避免短时间内大量分配和释放内存,以减少垃圾回收器的压力。
    • 使用对象池等技术,减少内存分配和回收的频率。

此外,还应关注以下几点:

  • 确保编译器的优化选项已开启(如-optimize),以优化生成的代码。
  • 监控应用的内存使用情况,及时发现和处理内存异常。
  • 编写单元测试,确保代码的正确性和稳定性,避免内存问题。

总之,解决Go语言中的内存问题需要综合运用多种工具和方法,从代码设计、数据结构选择到运行时监控等方面进行全面排查和优化。

回到顶部