【问题标题】:.NET: What is typical garbage collector overhead?.NET:典型的垃圾收集器开销是多少?
【发布时间】:2011-01-17 01:35:17
【问题描述】:

5% 的执行时间花在 GC 上? 10%? 25%?

谢谢。

【问题讨论】:

  • 我不知道 .NET,但我确信我知道答案:取决于! :)
  • 如果您担心.net 性能,那么垃圾收集器不应该是您的主要担心。如果您编写算法代码(信号处理、压缩),那么在将 C++ 算法移植到 .net 时,可能会出现明显的减速。在我看到的例子中,它很容易慢两倍以上。如果不这样做,与等待磁盘访问或在非托管库中花费的时间相比,所有 .net 开销都可以忽略不计。

标签: c# .net clr


【解决方案1】:

这完全取决于应用程序。垃圾收集是按要求完成的,因此您分配的大量内存后来变成垃圾的频率越高,它必须运行的频率就越高。

如果您预先分配所有内容并且从不分配任何新对象,它甚至可能低至 0%。

在典型的应用程序中,我认为答案非常接近 0% 的时间花在垃圾收集器上。

【讨论】:

  • 我知道这很大程度上取决于内存使用情况,但也许有一些典型的开销预期?
  • @vladimir 一个典型的期望是根本不必关心
【解决方案2】:

This blog post 对此领域进行了有趣的调查。

海报的结论?对于他的例子来说,开销可以忽略不计。

所以 GC 堆是如此之快,以至于在实际程序中,即使在紧密循环中,您也可以使用闭包和委托,甚至无需考虑(甚至几纳秒)。与往常一样,进行干净、安全的设计,然后分析以找出开销在哪里。

【讨论】:

  • 他的结论很清楚。他的最后一点是正确干净、安全的代码,然后配置文件以发现问题,这可能是最好的建议。要了解您的实际开销,请进行一些测试和一些内存配置文件。那你就肯定知道了。
  • 我认为这篇博文有点误导。作者正在运行单线程测试,并使用简单的开始和结束时间差来“衡量”GC 开销。实际上,他正在测量 lambda 的开销,而 GC 将在不同的线程中运行。 (至少这是我所期望的。有人可以证实或反驳这一点吗?)
  • @sfussenegger,据我所知,我在配置为使用物理机单核的 VM 中运行了测试。无论如何,如果它在多核上表现得更好,那就是另一个支持 GC 而非手动内存管理的论点。
【解决方案3】:

开销变化很大。将问题域简化为“典型场景”并不实际,因为 GC(以及相关函数,如终结)的开销取决于几个因素:

  • 您的应用程序使用的 GC 风格(影响您的线程在 GC 期间可能被阻塞的方式)。
  • 您的分配配置文件,包括您分配的频率(当分配请求需要更多内存时自动触发 GC)和对象的生命周期配置文件(第 0 代收集速度最快,第 2 代收集速度较慢,如果您诱导大量2 个集合,您的开销会增加)。
  • 可终结对象的生命周期配置文件,因为它们必须完成终结器才能有资格被收集。

可以分析各个点对每个相关轴的影响(可能还有更多相关的领域我想不起来)——所以问题实际上是“你如何减少那些与“常见场景”相关的轴?”

基本上,正如其他人所说,这取决于。或者,“足够低,在它显示在分析器报告上之前你不应该担心它。”

【讨论】:

    【解决方案4】:

    是的,垃圾收集器将花费大约 X% 的时间来收集所有应用程序的平均时间。但这并不一定意味着时间是开销。 对于开销,您实际上只能计算在非托管平台上释放等量内存后剩余的时间。

    考虑到这一点,实际开销是,但垃圾收集器将通过批量释放几块内存来节省时间。这意味着更少的上下文切换和整体效率的提高。

    此外,从 .Net 4 开始,垃圾收集器在不同的线程上做了很多工作,不会过多地中断您当前正在运行的代码。随着我们越来越多地使用多核机器,其中一个核心有时甚至可能处于空闲状态,这很重要。

    【讨论】:

      【解决方案5】:

      它真的可以改变。看看我写的这个演示short-but-complete程序:

      http://nomorehacks.wordpress.com/2008/11/27/forcing-the-garbage-collector/

      这显示了大型 gen2 垃圾收集的效果。

      【讨论】:

        【解决方案6】:

        在本机 C/C++ 中,由于找到大小合适的空闲内存块,有时分配内存的成本很高,由于释放内存的成本也不为 0不必将释放的内存链接到正确的块列表中,并将小块组合成大块。

        在 .NET 中,分配一个新对象非常快,但是当垃圾收集器运行时,您需要付出代价。 但是,垃圾回收短期对象的成本尽可能接近免费。

        我一直发现,如果垃圾收集的成本对您来说是个问题,那么您的软件设计可能会遇到更大的问题。分页可能是一个大问题如果您没有足够的物理 RAM,则任何 GC,因此您可能无法将所有数据都放在 RAM 中并依赖操作系统根据需要提供虚拟内存。

        【讨论】:

          猜你喜欢
          • 2018-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-07
          • 2011-10-12
          • 1970-01-01
          • 2010-10-04
          • 1970-01-01
          相关资源
          最近更新 更多