V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
w568w
V2EX  ›  程序员

运行时 GC 成为过 / 可能成为你的性能瓶颈吗?

  •  
  •   w568w · 158 天前 · 2104 次点击
    这是一个创建于 158 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://www.v2ex.com/t/1052490 有感。

    这里的 GC 特指追踪( Tracing GC ,如 JVM 、Go )和引用计数(想不到例子)等一般意义上的运行时垃圾回收制,不包括 C++/Rust 等编译期确定的垃圾回收机制。

    问题

    1. 你在业务中遇到过(或预计遇到)由 GC 带来的、不能接受的性能瓶颈吗(如 STW )?你有过针对 GC 来修改代码,以优化性能的经历吗?
    2. 如果用可以避免堆分配的语言(如 Go ),你会有意选择减少堆分配的写法,来节约 GC 成本吗?
    3. 对目前使用语言的 GC 性能满意吗?
    4. 你的业务场景下,可能会为避免 GC 的其他缺陷(例如内存颠簸)换到无 GC 语言吗?
    15 条回复    2024-06-27 12:39:54 +08:00
    passive
        1
    passive  
       158 天前 via Android
    引用计数(想不到例子):Perl 和 C++的 shared_ptr 🐶
    LeeReamond
        2
    LeeReamond  
       158 天前   ❤️ 1
    跑过性能分析的都知道,网络应用里 99%的时间在等待 IO ,所以其实计算影响通常不是主要优化方向-->且计算优化中 GC 优化也通常不是主要方向-->且就算进行 GC 优化首先你得能遇到对应场景,如原贴中所说瞬间回收 8TB 的堆-->且就算遇到了对应的场景,你还得坚持使用 GC 语言开发该部分逻辑。

    总的来说感觉就是 0.01%需求会考虑到的问题,与中小公司绝缘。大公司的产品线就算做到百万月活,和这种问题也基本摸不到边。唯一思考这些的可能是阿里的 P8 架构师这种,问题在于人家何必用你的来路不明的东西。。
    qweruiop
        3
    qweruiop  
       158 天前
    @LeeReamond 现在 zgc 之后,7 百万日活的游戏产品都没遇到过。。。
    privil
        4
    privil  
       158 天前
    不好意思,没达到公司性能目标,决定从 Go 切换到 Rust 。
    关于 Discord 为什么从 Go 切换到 Rust
    https://mp.weixin.qq.com/s/daVBNO19S_nz6ISBF2PbDQ
    BiChengfei
        5
    BiChengfei  
       158 天前
    GC 默认配置的性能 > 我的垃圾代码,向来是写了垃圾代码,导致 GC 不理想
    zvvvvv
        6
    zvvvvv  
       158 天前
    绝大多数的 GC 瓶颈,不应该是垃圾代码导致的嘛
    yty2012g
        7
    yty2012g  
       158 天前   ❤️ 1
    Q: 你对目前使用语言的 GC 性能满意吗?
    A: 一路从 jdk8 的 parNew+CMS ,升级到 JDK17 的 G1 ,再到今年的 JDK22 的 G1 ,我对 G1 GC 越来越满意了,堆虽然不大但是延迟也很低(< 10ms ), 吞吐量影响相当小,内存占用也不多,可以说是非常理想了。中途也尝试过 JDK17 的 ZGC 、JDK21 的分代 ZGC ,奈何对吞吐量的影响远大于 G1 ,遂放弃
    nagisaushio
        8
    nagisaushio  
       158 天前 via Android
    rust 如果滥用 Arc Mutex 就相当于一个很烂的引用计数 GC
    zhouhu
        9
    zhouhu  
       157 天前
    @yty2012g Java 高版本持续对 G1 做了很多优化。
    w568w
        10
    w568w  
    OP
       157 天前 via Android
    @qweruiop 好奇问问:这个级别的日活会考虑亚毫秒级暂停带来的性能损失吗?
    dragonfsky1
        11
    dragonfsky1  
       157 天前
    没遇到过,不过这种要求这么高的场景估计也不会选择带 GC 的语言吧?
    qweruiop
        12
    qweruiop  
       157 天前
    @w568w 游戏项目的话:个人很想考虑。。。但是全局来看,公司不愿意投入研发资源,觉得收益不明显。
    CatCode
        13
    CatCode  
       157 天前
    不会 我写 Python 的
    INCerry
        14
    INCerry  
       157 天前   ❤️ 1
    我目前主要使用 C#语言,回答一下这个问题(之前有在 top 互联网、金融公司使用 C#案例)

    1.你在业务中遇到过(或预计遇到)由 GC 带来的、不能接受的性能瓶颈吗(如 STW )?你有过针对 GC 来修改代码,以优化性能的经历吗?

    在极端测试中经常遇到慢很多倍,卡好几秒这样的场景,但实际在业务中,没有遇到过这个问题,也没有针对 GC 修改代码来优化性能。

    2.如果用可以避免堆分配的语言(如 Go ),你会有意选择减少堆分配的写法,来节约 GC 成本吗?

    经常使用这种方式来减少堆分配,比如池化内存,使用堆外内存等方式。

    3. 你对目前使用语言的 GC 性能满意吗?

    目前.NET GC 还是针对高吞吐量进行优化的,STW 表现从测试来看并不是最好,但是实际场景中从来没有遇到过问题。

    4. 你的业务场景下,可能会为避免 GC 的其他缺陷(例如内存颠簸)换到无 GC 语言吗?

    并不会,切换到其它无 GC 语言,带来的提升不会很高,有时候 RAII 和引用计数的开销其实更大,特殊场景下无 GC 语言频繁内存申请吞吐量不如带 GC 。(不过本身 C#就可以做到无 GC ,似乎也没有换的必要)
    Kumo31
        15
    Kumo31  
       157 天前   ❤️ 1
    share 下 JuiceFS 的一篇文章,有提到对 Go 做的内存优化:[极限挑战:使用 Go 打造百亿级文件系统的实践之旅]( https://juicefs.com/zh-cn/blog/engineering/go-build-billion-file-system)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2574 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:41 · PVG 13:41 · LAX 21:41 · JFK 00:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.