【问题标题】:Is it possible to stop .NET garbage collection?是否可以停止 .NET 垃圾收集?
【发布时间】:2011-03-05 16:53:41
【问题描述】:

程序员是否可以在 C# 编程语言中以编程方式启动/停止垃圾收集?比如性能优化等等。

【问题讨论】:

  • 垃圾收集不是 C# 编程语言的一部分。它是 .NET CLR 的一部分。
  • “有点。”如果你从不分配任何东西,GC 将永远不会收集。预先分配您需要的一切,然后致电GC.Collect()
  • 也许也看看这个答案:stackoverflow.com/questions/6005865/…

标签: c# .net garbage-collection


【解决方案1】:

由于.NET 4.6 可以,GCclass 中有方法:

GC.TryStartNoGCRegion(...)GC.EndNoGCRegion()

【讨论】:

    【解决方案2】:

    不是真的。您可以通过GC.AddMemoryPressureGC.RemoveMemoryPressure 等方法给GC 提示,但不能完全停止。

    此外,垃圾收集并不是一个密集的过程。程序员很少会担心它。

    【讨论】:

    • 哦,我明白了... SuppressFinalize() 方法怎么样?它有不同的目的吗?
    • SuppressFinalize 作用于单个对象。绝对不是整个 GC。来自 MSDN:实现 IDisposable 接口的对象可以从 IDisposable.Dispose 方法调用此方法,以防止垃圾收集器在不需要它的对象上调用 Object.Finalize。 (所以基本上这是一个非常轻微的性能提升。)
    • 我看不出这会如何为 prevent 垃圾收集本身添加提示;如果您调用GC.AddMemoryPressure,那么这很可能会导致 CLR 进行 more 垃圾回收,因为它表明 CLR 可用于进程(虚拟或其他)的内存少于它认为的确实如此。一个可以调用GC.RemoveMemoryPressure而不调用GC.AddMemoryPressure,试图诱使CLR认为它比它拥有更多的内存,但人们会认为API是有抵抗力的(一个希望)到这样的事情。
    • @CasperOne:关于 AddMemoryPressure,你是对的。我在答案中使用它作为与 RemoveMemoryPressure 的比较/对比点。问题的标题仅指停止 GC,但问题指的是启动和停止,所以我提到了两者。尽管没有人真正开始或停止任何事情。它们只是提示。
    • 同时有可能,请参阅here
    【解决方案3】:

    一般来说,不会。大多数人会认为担心垃圾收集是过早的优化,除非您进行一些分析并发现它确实是您的应用程序性能不佳的原因。

    如果您对调整 GC 以提高性能的细节感兴趣(或者更有可能是调整您的应用程序以提高其相对于 GC 的性能),MSDN 有一个相当不错的方法描述。

    【讨论】:

      【解决方案4】:

      不,没有。充其量你可以自己触发垃圾收集,尽管这被认为是一件非常糟糕的事情,因为它会干扰 GC 使用的内置调度算法。

      【讨论】:

      • 你不能触发收集,只能“建议”到。 GC会自己决定
      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多