-1

根据我的研究,一般的经验法则是不要乱用 GC(即不要调用 GC.Collect())。我们有一个基于服务器的进程来处理巨大的 XML 文档——内存永远不会被释放。代码如下所示:

while (!abort)
{
  mutex.WaitOne();

  //sets abort to true to end the process itself
  DoSomeWork();

  mutex.ReleaseMutex();
}

DoSomeWork() 运行后,内存永远不会被释放。发生这种情况是因为 GC 没有任何“独处时间”来做它的事情吗?我们应该在 DoSomeWork() 之后调用 GC.Collect 来强制 GC 吗?

谢谢

4

2 回答 2

1

尝试在开发环境中调用GC.Collect,看看会发生什么。如果内存没有下降,则说明内存泄漏。这可能意味着您没有释放您实际完成的对象,并且在某处对它们进行了引用;或者可能是您没有正确处理非托管内存。如果它确实下降,则意味着您只需要给 GC 时间。

如果对象确实符合收集条件(根据之前的测试),请考虑是否必须立即减少内存,或者等待几百毫秒以安排 GC 是否可以接受。您是否收到 OOM 错误?应用程序是否因此被交换到磁盘?如果不是,请考虑等待 GC 执行此操作。

还要问问自己性能是一个问题,还是只是记忆问题。手动调用Collect可能会损害性能,而不是帮助它。

于 2012-12-03T17:10:26.083 回答
0

在某些杀死大量对象的进程完成后,您应该随时调用 GC.Collect。处理 XML 文档是一个典型的例子,说明这是正确的做法。任何告诉你从不打电话给 GC.Collect的人只是在坚持他们所学的内容,这通常是正确的,但并非总是如此。

于 2012-12-03T16:25:57.607 回答