【发布时间】:2016-08-03 12:10:24
【问题描述】:
我正在调查我们的 C#/WPF/.NET 4.51 应用程序中可能存在的内存泄漏。
我在启动后直接拍摄了应用程序的快照,并在分配的内存超过顶部的几个小时后拍摄了快照。
我使用 VisualStudio 的进程转储工具检查了托管堆实例。一切看起来都很好。
在 WinDbg 中打开转储似乎证实了这一点,因为堆和堆栈以我预期的方式增长(+50MB)(左:第一次转储,右:最后一次转储):
让我恼火的是,提交页面的大小增长了很多(左:第一次转储,右:最后一次转储):
此外,VMMap 将这个巨大的提交块显示为“私有数据”(与上面的转储无关。屏幕截图是大约一个小时后拍摄的):
请纠正我:
由于堆很好,并且私有字节直接使用 VirtualAlloc() 分配,我可以从可能的泄漏候选列表中排除“我们的”托管应用程序代码。
有没有办法缩小泄漏的原因?
【问题讨论】:
-
您是否在使用任何非托管库? debugdiag 2 是一个很好的起点
-
如果你使用excel插值之类的东西,如果你不释放所有大量的excel部分,垃圾收集器可能需要很长时间才能释放东西。
-
是的,我们使用了很多外部组件。在停用每个组件之前,我试图将泄漏缩小一点。谢谢。现在正在尝试 DebugDiag...
-
哪个 windows 版本?在 Windows 10 1607 中,使用带有 WPT/WPR 的 ReferenceSet 跟踪:aloiskraus.wordpress.com/2016/06/26/… 并查看 VALloc 调用堆栈以查看内存分配的位置。
-
也许 WPA 可以帮助您缩小范围。我会试试xperf - Collect Heap_Launch.cmd。
标签: c# memory memory-leaks windbg