【发布时间】:2021-01-22 21:56:57
【问题描述】:
近年来,许多特性被添加到 C#(在 .NET 世界中不是第一名)以减少 GC 压力。无可争辩的是,所有这些特性使我们能够构建更好、更高效的应用程序。但无论随着时间的推移添加何种语言和 VM(CLR、JVM)功能,高性能和非阻塞 GC 都是托管应用程序的关键性能因素。
最近在 JVM 世界中出现了两种新的 GC,它们似乎提供了卓越的指标。有一些资源(包括作者)提供有关这些 GC 的基准和技术见解。我们可以了解到,最大 STW(停止世界)间隔“被承诺”不再是 10 毫秒,并且无论堆大小如何,通常平均振荡低于 1 毫秒。还有一些测试表明新的 GC 开销得到了很好的平衡,不会对应用程序吞吐量产生负面影响,同时大大减少了(10 倍或更多)STW 暂停。
另一方面,关于 CLR GC 的信息很少。是否有任何最新资料可以查看 CLR GC(4.8、Core 3.1、.NET 5)与最新 JVM 成就的比较? 我可以找到一些讨论 CLR GC 与 G1 的旧资源。但是今天的 G1 无法与 ZGC/Shenandoah 相提并论,旧的消息来源并没有像今天这样显示现实。考虑到没有更新的来源,我们可以得出结论,CLR GC 指标从那时起并没有显着改善。但这对于 2020 年的 .NET 平台来说似乎是一个真正的问题,因为与平均 1 毫秒和最大 10 毫秒相比,平均 STW 大约 20-30 毫秒,偶尔跳到 300+ 毫秒看起来真的很糟糕(正如 GC 制造商声称和测试的那样)确认)在 JVM 上暂停。
我必须说这让我有点担心,因为有一大堆应用程序的 GC 暂停很重要。事实上,它们是决定特定技术(例如 .NET、JVM、本机等)是否应被视为对任务或目的可行的关键因素之一。看起来 JVM 上的最新 GC 为 Java 和其他 JVM 语言/技术开辟了新领域。我们不允许应用程序停止 500 毫秒左右的区域,因为 GC 必须完成它的工作,而最大约 10 毫秒,平均约 1 毫秒就足够了。
今天的真相是什么? CLR GC 与最新的 JVM GC 相比如何?是否有关于 CLR 上的 STW 暂停的任何保证(看起来 JVM 正在朝着这个方向发展)?
【问题讨论】:
-
ZGC 越来越好了。 JDK 16 的初步结果显示,在 3 TB 堆上的最大暂停时间不到 1 毫秒。 “有问题的 GC 暂停已成为过去”youtu.be/88E86quLmQA?t=1728
标签: c# .net garbage-collection jvm clr