.NET 4.5内存泄漏

时间:2013-06-10 12:06:21

标签: c# .net .net-4.5 memory-leaks

我在.NET / C#中编写的应用程序有问题。它由一台管理其他几台机器的服务器组成,并对它们进行测试。它是一个Windows窗体应用程序。为了运行具有适当错误处理的测试,对于每台机器,我有两个线程:一个用于运行测试,另一个用于连续ping。每台机器都有一个运行队列,其中存储了任务,将在该特定机器上运行任务 问题是,经过一段时间,当队列中存在多个任务时,它消耗的内存(进程资源管理器,任务管理器)逐渐从大约50-100MB增加到1.6-1.8 GB。大约在此限制下,几乎每个事务(共享上的文件副本,远程WMI访问)与远程计算机都会因“存储空间不足”或“内存不足”而失败。我尝试了一些工具来本地化字符串,我得到的最接近的是.Net Memory Profiler。这没有太大帮助,因为最大的内存量存在于“私有数据 - 未识别”中。我猜它是非托管数据,因为我可以评估所有其他数据(从我的程序)到每个字符串和int,以及它的每个实例。
任何人都可以建议我可以使用的工具,以正确本地化泄漏,并可能修复它。如果我知道DLL(来自我的应用程序)/使用该内存的线程,或者至少我能以某种方式查看该内存中的内容,这对我有很大的帮助。

注意:很多帖子都有两个例外:没有足够的存储空间和内存不足。他们中的大多数人建议在'服务器'机器上增加IRPStackSize(在我的情况下,客户端)。我在所有机器上都有50(0x32)的IRPStackSize,包括服务器。

修改
关于评论:是的,我确实记录了日志,但没有什么奇怪的事情发生。使用内存分析器我发现我的应用程序,当非托管部分超过1GB时,.NET端使用大约20MB的内存。在WinDbg的帮助下,我发现了额外内存中的内容(大部分内容)。为了访问机器并对它们运行不同的测试,我使用WMI,我有一个包装器。我使用的所有东西都被处理掉了(使用语句,有些实际调用了Dispose方法。奇怪的是,内存中充满了这个类的克隆。有没有人知道为什么类会在内存中克隆自己。 注意:内存使用率以大约5MB / s的速度增加,因此实际上并不是很长一段时间。我也想知道它为什么没有被垃圾收集器释放。我使用C#类来处理WMI,而不是COM,也不使用非托管代码。此外,在堆上的对象中,我看到很多属于wmiutils的数据CWbemError。奇怪的是,谷歌甚至不知道这个词(没有CWbemError的结果)

0 个答案:

没有答案