1

我对我们的应用程序中的内存泄漏感到困惑。它只发生在客户的机器上,或者至少在我的机器上重现它的测试失败了。幸运的是,如果发生未处理的异常,我们的应用程序会将一些数据收集到日志文件中,如果它是 OOM,则写入转储文件。它是一个 32 位 C# WinForms 程序。

到目前为止我能找到什么:

  1. 该进程在崩溃之前运行了大约三个小时

  2. 在崩溃时收集了以下值:

currentProcess.WorkingSet64 = 1,8 GB currentProcess.VirtualMemorySize64 = 2.0 GB currentProcess.PrivateMemorySize64 = 680 MB

这是让我认为它不受管理的第一点。为什么 WorkingSet 比 PrivateMemory 高这么多?我猜可能是第三方dll?

因此,为了进一步分析,我将内存转储加载到 WinDbg

  1. SOS 命令 !analyzeoom 告诉我:由于 GC 堆上的分配,没有托管 OOM。为了验证,我查看了 !eeheap,它告诉我 GC 堆的总大小为 217 MB,Loader 堆的总大小为 38 MB

  2. 现在我想看看所有的堆。但是使用 !heap -s 显示 Commited Bytes 170 MB 的组合值

  3. !dumpheap -stat 再次显示最大的消费者大约是 10-25 MB。还有大约 4000 个免费对象,占 38 MB。

最后一个值让我觉得可能OOM是由碎片引起的。但是 38 MB 听起来并不多。

在这一点上我不确定如何继续我如何找到这么多丢失的内存?我怎样才能知道它是否是第三方程序集以及哪一个程序集?

遗憾的是,我无法共享内存转储,因为它包含敏感的客户数据。但我很感激任何建议/提示

4

1 回答 1

0

它是一个 PDF 查看器组件,带有错误配置的 ImageCache 选项。感谢所有的帮助

于 2021-04-06T06:08:23.623 回答