能否停止.NET垃圾回收?

13

在C#编程语言中,程序员是否可以以编程方式启动/停止垃圾回收呢?例如,为了进行性能优化等。

是的,C#编程语言允许程序员使用GC.Collect方法来手动启动垃圾回收。但是,需要注意的是,这样做可能会影响应用程序的整体性能。通常情况下,垃圾回收会自动管理和执行内存资源的释放,因此只有在特定情况下才建议手动启动垃圾回收。

3
垃圾回收不是 C# 编程语言的一部分,它是 .NET CLR 的一部分。 - John Saunders
“有点。” 如果您从未分配任何内容,垃圾回收器将永远不会进行回收。预先分配所需的所有内容,然后调用GC.Collect() - Andrew Russell
1
也许你也可以看一下这个答案:https://dev59.com/OW025IYBdhLWcg3wblg3#6005949 - Gamlor
4个回答

11
自 .NET 4.6 版本以来,出现了一些与垃圾回收相关的方法,这些方法位于 GC 中,包括: GC.TryStartNoGCRegion(...)GC.EndNoGCRegion()

9
不完全是。您可以通过像GC.AddMemoryPressureGC.RemoveMemoryPressure这样的方法来提供GC提示,但无法完全停止它。
此外,垃圾收集并不是一个非常繁重的过程。程序员很少会担心它。

哦,我明白了... SuppressFinalize() 方法呢?它有不同的用途吗? - Alex
SuppressFinalize 只适用于单个对象,而不是整个 GC。根据 MSDN 的说法:实现 IDisposable 接口的对象可以从 IDisposable.Dispose 方法中调用此方法,以防止垃圾回收器在不需要的对象上调用 Object.Finalize。(因此,它基本上是一种非常轻微的性能增强。) - Paul Sasik
我不明白这怎么会添加一个提示来防止垃圾回收;如果你调用GC.AddMemoryPressure,那么很可能会导致CLR进行更多的垃圾回收,因为它表明CLR用于进程(虚拟或其他)的可用内存比它认为的要少。可以在没有对GC.AddMemoryPressure进行相应调用的情况下调用GC.RemoveMemoryPressure,试图欺骗CLR认为它拥有比实际更多的内存,但人们会认为API会抵制这样的事情(希望如此)。 - casperOne
@CasperOne:你关于AddMemoryPressure是正确的。我在答案中使用它作为与RemoveMemoryPressure对比的点。问题的标题只涉及停止GC,但问题涉及启动和停止,所以我提到了两者。虽然它们都没有真正启动或停止任何东西,它们只是提示。 - Paul Sasik
1
同时,您可以在此处查看链接 - Pollitzer

6
一般来说,不需要担心垃圾回收。除非你进行了一些分析,并发现它确实是你的应用程序性能不佳的原因,否则大多数人会认为这是过早优化。
如果你对调整垃圾回收以提高性能(或更有可能是调整你的应用程序以改善其相对于垃圾回收的性能)感兴趣,MSDN有一个相当不错的描述如何做到这一点的链接。请参考这里

4

没有,最多只能自己触发垃圾回收,但这被认为是非常糟糕的事情,因为它可能会干扰GC使用的内置调度算法。


1
你不能触发收集,只能“建议”进行。垃圾回收器将自行决定。 - Dzianis Yafimau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接