Go 初学者,有没有老哥能告诉我在写代码的时候应该如何避免内存泄漏的问题

76 天前
 bunny189

万分感谢! 并不是想 100%避免,只是希望少点蠢代码……

4672 次点击
所在节点    Go 编程语言
39 条回复
kaf
75 天前
一般不是搞一堆 goroutin 很难触发,注意使用 defer ,定时重启,go 原生程序重启真的很快
crackidz
75 天前
Go 不乱搞一般没有内存泄露,资源泄露排查一下打开的东西是不是没关
dyllen
75 天前
@Ipsum 这个问题在 1.23 版已经解决了,不会又问题了。
mainjzb
75 天前
https://github.com/UltimateYhq/100-GO-mistakes

看这种常规错误避免,剩下 gc 帮你兜底应该问题不大。
testcgd
75 天前
1. checklist 各种,这里手打太麻烦了,你可以直接上网搜一下,主要还是协程泄露比较多,全局变量的泄露很少的,避免协程被 chan 阻塞,基本就可以了
2. 建立优雅重启的方案,如果你的程序一小时可以无损的重启一次,加上监控,内存大了起个新的实来接管流量,这个可以把影响降到最低
3.其实比起内存泄露,你更应该担心的是 panic 导致的进程异常退出,没处理好容易有各种的脏数据
NewYear
75 天前
懂了,先搞一个启动器,接管 tcp/udp ,启动主程序,并定时启动新的,关掉旧的……
客户端连接的时候映射到新启动的,旧的自然就不需要了。

完美~

等等,这不就是集群么
oneisall8955
75 天前
没用过 go ,真的有企业采用定时重启方案?震惊
testcgd
75 天前
@oneisall8955 企业不是定时重启,而是是版本迭代加 pgo 优化编译 人工狗头
nyxsonsleep
75 天前
@oneisall8955 #26 同样震惊
GeekGao
75 天前
@oneisall8955 有,以前听过一个同事分享过,某大安全厂商旗下搜索引擎有个服务,第三方库搞不定内存泄露问题,就用重启大法了。
bunny189
75 天前
@mainjzb 好!谢谢老哥,我看看
@testcgd 恩恩,想问问大佬,如果协程只是执行一个函数(比如:更新数据库记录)这种不需要 channel 通信的,是不是基本不会有阻塞的问题?
testcgd
74 天前
@bunny189 基本不会,不过也要看实现,有时候不一定是阻塞,qps 高的时候慢查询也会有问题的,上线再说,有问题重启就好
bunny189
74 天前
@testcgd 明白了,谢谢您!
edcopclub
74 天前
一般只需要注意 goroutine 结束不了的情况,比如一直阻塞。
picone
73 天前
- 统计 gorouting 使用场景并上报 metric 。如果是 HTTP 服务可以接口路径作为一个 label ,这样即使发生 goroutine 泄露也能快速定位是哪个场景的问题。
- 少修改全局变量。全局变量修改会涉及竞态问题也麻烦
- pprof 可以不开启,但是可以做个内部调用接口开启,在发生内存泄漏的时候开启然后收集即可,这样对性能影响也不大。
snowlyg
73 天前
重启方案 当然是最简单实用的方案啊
Jinnrry
73 天前
线上默认把 pprof 打开就行了,我写了四五年 go 了,还从来没遇到过内存泄露。

一般 fd 、goroutine 之类的泄露比较多。
Jinnrry
73 天前
@GeekGao #30 我当年也遇到过,某个第三方库内存泄露了,一时半会搞不到,恰好又遇到双十一活动,上报 cto 后,协调了几十台几 T 内存的服务器过来硬扛了半个月,每天不同机器再轮流重启
GeekGao
73 天前
@Jinnrry 2333 能解决业务问题就好。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1069135

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX