The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
bunny189

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

  •  
  •   bunny189 · Aug 30, 2024 via iPhone · 8090 views
    This topic created in 796 days ago, the information mentioned may be changed or developed.

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

    39 replies  •  2024-09-02 12:51:54 +08:00
    bunny189
    bunny189
    OP
    Aug 30, 2024 via iPhone
    1
    目前已经写完一个项目,即将上服务器(有固定人流量),所以有点紧张,想临上线前看看有没有出一些愚蠢低级的错误()
    DefoliationM
    DefoliationM
    Aug 30, 2024 via Android
    2
    go 有 gc ,何来内存泄漏一说。逻辑问题你只能写代码时看清楚吧。
    R4rvZ6agNVWr56V0
    R4rvZ6agNVWr56V0
    Aug 30, 2024❤️2
    4
    ashin
    ashin
    Aug 30, 2024❤️3
    5
    定时重启 /狗头
    bunny189
    bunny189
    OP
    Aug 30, 2024 via iPhone
    6
    @GeekGao 谢谢好心人,我对照着自查一下❤️!
    @ashin 难道他真是天才??!
    virusdefender
    virusdefender
    Aug 30, 2024
    7
    线上默认把 pprof 打开,别到时候发现泄露了还得重新编译
    Trim21
    Trim21
    Aug 30, 2024❤️1
    8
    你不用 unsafe ,不用 arena 之类的东西的话一般不会有内存泄漏。一般泄漏的都是 fd 、socket 、goroutine 之类的东西。
    James369
    James369
    Aug 30, 2024
    9
    写完让 ChatGpt 检查一下
    mightybruce
    mightybruce
    Aug 30, 2024
    10
    一般使用 go 的一些静态检查分析工具,过滤掉大多数问题代码,go vet 工具
    tuiL2
    tuiL2
    Aug 30, 2024
    11
    golang 能写出内存泄露,应该也挺不容易的吧
    maigebaoer
    maigebaoer
    Aug 30, 2024 via Android
    12
    一般泄露的都是全局资源,小项目挺难遇到的
    bruce0
    bruce0
    Aug 30, 2024
    13
    我唯一遇到过一次的 go 内存泄漏是 goroutine 工作完成后没有结束(被阻塞了) 然后相关的资源都没有释放, 别的基本遇不到内存泄漏
    povsister
    povsister
    Aug 30, 2024
    14
    go 一般是资源泄露,用 goroutine 前想想这个东西的生命周期就能避免大多数情况。
    donaldturinglee
    donaldturinglee
    Aug 30, 2024
    15
    go 的垃圾回收还是很健壮的,非常规问题不考虑内存泄漏
    Ipsum
    Ipsum
    Aug 30, 2024
    16
    别再 for 里用 time.after
    higker
    higker
    Aug 30, 2024
    17
    建议你使用 Java21 版本 和 graalvm.org 这种多语言虚拟机,可以管理多语言跑多语言,管理内存分配。
    securityCoding
    securityCoding
    Aug 31, 2024 via Android
    18
    go lint 扫一下,profile 看看内存和协程数量
    kneo
    kneo
    Aug 31, 2024
    19
    你在这发有啥用?赶紧上线啊。让用户帮你测试。
    lingo
    lingo
    Aug 31, 2024
    20
    我 go 项目有用到 cgo ,没想到用的那个 cgo 库居然自带内存泄露。。。
    kaf
    kaf
    Aug 31, 2024
    21
    一般不是搞一堆 goroutin 很难触发,注意使用 defer ,定时重启,go 原生程序重启真的很快
    crackidz
    crackidz
    Aug 31, 2024
    22
    Go 不乱搞一般没有内存泄露,资源泄露排查一下打开的东西是不是没关
    dyllen
    dyllen
    Aug 31, 2024
    23
    @Ipsum 这个问题在 1.23 版已经解决了,不会又问题了。
    mainjzb
    mainjzb
    Aug 31, 2024
    24
    https://github.com/UltimateYhq/100-GO-mistakes

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

    完美~

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

    一般 fd 、goroutine 之类的泄露比较多。
    Jinnrry
    Jinnrry
    Sep 2, 2024
    38
    @GeekGao #30 我当年也遇到过,某个第三方库内存泄露了,一时半会搞不到,恰好又遇到双十一活动,上报 cto 后,协调了几十台几 T 内存的服务器过来硬扛了半个月,每天不同机器再轮流重启
    R4rvZ6agNVWr56V0
    R4rvZ6agNVWr56V0
    Sep 2, 2024
    39
    @Jinnrry 2333 能解决业务问题就好。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2814 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 95ms · UTC 13:12 · PVG 21:12 · LAX 05:12 · JFK 08:12
    ♥ Do have faith in what you're doing.