【发布时间】:2013-05-03 08:25:16
【问题描述】:
我不完全确定该去哪里寻求帮助,所以我想我会尝试使用 stackoverflow,因为它通常可以回答大约 90% 的与编程相关的问题。
简而言之,我有一个正在泄漏内存的开源 .NET 应用程序。从某种意义上说,这可能不是真正的内存泄漏,当应用程序关闭时,我怀疑内存已被回收,但在它运行时,它会不断分配更多内存而不释放它。最终,System.OutOfMemoryException 被抛出。
为了调试问题,我按照this article 中推荐的步骤进行了操作,并生成了下图,其中红色是 .NET/CLR 内存“所有堆中的#Bytes”,绿色是带有 windows 的进程“私有字节” ' 性能监视器工具(请注意,绿线已被统一缩小以显示更接近红线,因为我只关心线条的形状):Performance Monitor Output。
我将图像作为托管内存泄漏的证据,然后使用 Windows 的调试诊断工具尝试定位泄漏源(如文章中所述)。但是我从调试诊断工具得到的报告很奇特。
基本上,我在应用程序运行时每 5 秒尝试一次收集“完整用户转储”的每次尝试都被垃圾收集器始终处于当时的垃圾回收周期,导致调试诊断工具输出错误,并阻止它收集任何有用的 .NET 内存相关信息。
现在我被卡住了,我知道我有一个托管内存泄漏,但我不知道如何缩小它的范围。我也很困惑垃圾收集器如何总是处于收集周期的中间,这让我想知道垃圾收集线程是否被某种方式阻塞,阻止它释放内存和/或退出垃圾收集周期。
在性能监视器图的某些部分中,分配的 .NET 内存稍微下降了一点,因此垃圾收集器不会永远卡住,但它肯定在大部分时间都卡住了,否则应该是调试诊断能够做一个用户转储。
几个问题:
.NET 应用程序中的垃圾收集器是否有可能在尝试释放一些内存时卡住,可能来自一些编码不良的析构函数/终结器或其他什么?
我可以使用什么策略来继续缩小问题的根源?
【问题讨论】:
标签: .net memory-leaks debugdiag performance-monitor