如何检测内存泄漏的位置?

Boo*_*one 13 .net c# memory-leaks

我有一个大型网站似乎正在吸收正在分配的所有内存.此站点旁边的服务器上没有其他任何内容.在一周内,它会吃掉2场演出并需要重新启动.目前这是使用IIS 7的服务器2008 32位.我们重新安装使用64位并添加更多内存.能够追踪泄漏发生的位置会很好.

那么跟踪内存泄漏的最佳做法是什么?

Bri*_*sen 14

.NET中的内存泄漏并不常见,但是当它们发生时,最常见的原因是未连接的事件处理程序.在侦听器超出范围之前,请确保分离处理程序.

另一种选择是,如果你忘记调用Dispose()IDisposable的资源.这可能会阻止清理非托管资源(不由GC处理).

而另一个可能的原因是一个僵局的终结者.这将阻止收集终结器队列中的所有剩余对象.

我使用WinDbg + Sos来追踪泄漏.步骤如下

  • 转储堆并寻找嫌疑人
  • 使用!gcroot找出什么让犯罪嫌疑人还活着
  • 根据需要重复

请注意,大量内存使用也可能是由于堆碎片造成的.常规堆是压缩的,但固定的对象可能会导致碎片.此外,LOH没有压实,因此LOH的碎片并不少见.

关于WinDbg + sos的优秀教程:http://blogs.msdn.com/tess/


Chr*_*nce 9

在您的代码上运行探查器.

这里有两个不错的选择:

RedGate的内存分析器

Jetbrains dotTrace

我相信这两款产品都有免费试用版.