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

5 天前
 w568w

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 语言吗?
1539 次点击
所在节点    程序员
15 条回复
passive
5 天前
引用计数(想不到例子):Perl 和 C++的 shared_ptr 🐶
LeeReamond
5 天前
跑过性能分析的都知道,网络应用里 99%的时间在等待 IO ,所以其实计算影响通常不是主要优化方向-->且计算优化中 GC 优化也通常不是主要方向-->且就算进行 GC 优化首先你得能遇到对应场景,如原贴中所说瞬间回收 8TB 的堆-->且就算遇到了对应的场景,你还得坚持使用 GC 语言开发该部分逻辑。

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

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

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

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

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

© 2021 V2EX