5

在一次采访中,我被要求想出一种方法来确保 c# 中的代码块可以在一致的时间运行以满足假设的时间要求。面试官提到,一种方法是在代码块执行之前调用垃圾收集器进行收集,这样可以显着降低在该代码块期间GC再次运行的概率。它被应用于医疗设备的基于时间的精确测量,其中垃圾收集会影响这些测量。

这对我来说很有意义,但我找不到任何支持它的信息。我审查的普遍共识是永远不要调用 GC.Collect(),例外情况不包括这种情况。

运行 GC.Collect() 真的可以降低它很快运行的概率吗?这是使用 .net 框架执行此操作的正确方法吗?GC.Collect() 是否也为其他 CLR 程序收集,还是仅适用于当前进程?

4

3 回答 3

13

贾里德的回答当然很棒。添加其他几点:

运行 GC.Collect() 真的可以降低它很快运行的概率吗?

是的。

这是使用 .net 框架执行此操作的正确方法吗?

I would not want the correctness of software that has human-life-safety-critical functions to depend on probabalistic guesses about the undocumented behaviour of the collector.

That said: you should do a WaitForPendingFinalizers after the collection. Remember, finalizers run on their own thread, and that might be taking up processor time.

Does GC.Collect() collect for other CLR programs too or is it only applicable to the current process?

Collecting cleans up managed memory in the current process, so if you have multiple appdomains in one process, collecting in one appdomain collects in the others. It does not go cross process.

于 2013-03-29T21:53:57.613 回答
12

运行 a绝对有可能GC.Collect降低它在紧随其后的代码中发生的概率。您可以制定许多明确的方案,在这些方案下它会有这种确切的行为。例如,如果下一次分配将导致收集并GC.Collect释放至少在场景期间分配的内存量。

然而,这是我永远不会依赖的事情。绝对不能保证会出现这种情况。事实上,收集可能不会在场景期间发生,并且运行强制的时间GC.Collect可能会超过场景时间本身。

保证GC.Collect在给定场景中不会运行的唯一方法是

  1. 不要分配任何内存
  2. 不要让其他人打电话GC.Collect

极难保证。

于 2013-03-29T21:29:38.790 回答
0

what you could possibly do, is specify to disable concurrent/background garbage collection through app.config: Concurrent Garbage Collection on MSDN

于 2013-03-29T22:11:53.057 回答