近年来,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毫秒最大值(GC制造商声称并测试似乎证实的暂停)相比,平均STW约为20-30毫秒,并偶尔跳至300多毫秒,看起来非常糟糕。
我必须说,这让我有些担心,因为有很多应用程序,其中GC暂停非常重要。事实上,它们是决定指定技术(例如.NET、JVM、本机等)是否应该考虑用于任务或目的的关键因素之一。似乎在JVM上,最新的GC为Java和其他JVM语言/技术开辟了新的领域。在这些领域中,我们不允许应用程序因GC必须执行其工作而停止500ms左右,而~10ms的最大值和~1ms的平均值已经足够好了。
真相是什么?CLR GC与最新的JVM GC相比如何?CLR是否有关于STW暂停的任何保证(看起来JVM正在朝这个方向发展)?
最近,在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毫秒最大值(GC制造商声称并测试似乎证实的暂停)相比,平均STW约为20-30毫秒,并偶尔跳至300多毫秒,看起来非常糟糕。
我必须说,这让我有些担心,因为有很多应用程序,其中GC暂停非常重要。事实上,它们是决定指定技术(例如.NET、JVM、本机等)是否应该考虑用于任务或目的的关键因素之一。似乎在JVM上,最新的GC为Java和其他JVM语言/技术开辟了新的领域。在这些领域中,我们不允许应用程序因GC必须执行其工作而停止500ms左右,而~10ms的最大值和~1ms的平均值已经足够好了。
真相是什么?CLR GC与最新的JVM GC相比如何?CLR是否有关于STW暂停的任何保证(看起来JVM正在朝这个方向发展)?