如果任务管理器中的Mem Usage不断增加,如何知道是否存在内存泄漏

时间:2011-07-13 08:52:28

标签: c# memory-leaks tcpclient tcplistener

我写了一个小的Server类,它基本上是一个TcpListener包装器和ThreadPool线程产生器。

线程运行Server :: ProcessMessage(),它执行一些工作来回发送消息,然后在它结束时退出。

但是在退出函数之前,我还调用TcpClient.GetStream()。Close()然后调用TcpClient.Close()。我不使用任何Mutex或ManualResetEvent WaitHandles。

测试了客户端和服务器,一切正常,除了在任务管理器中,它显示每个Server :: ProcessMessage()上的Mem Usage不断增加。即使在断开和关闭所有客户端应用程序之后,内存使用仍然存在,而不是减少。

服务器作为Windows服务运行。

我如何知道它是否是内存泄漏的迹象,或者只是垃圾收集器还没有完成它的工作呢?

感谢。

编辑: 我想我找到了“内存泄漏”的原因。我的Server :: ProcessMessage()中有Console.WriteLine()。如果有更简单的方法来检查内存问题,那么它仍然会有所帮助。

2 个答案:

答案 0 :(得分:2)

尝试使用带SoS扩展名的WinDbg来检查是否unneeded objects are still referenced in the heap。同时检查this link

您通常首先使用!DumpHeap -type (some-type-or-just-namespace)来获取某种类型的对象列表(我通常只是编写相关图层的命名空间来获取我认为可能仍在内存中的列表或对象。)

如果您有一个特定对象的多个实例,则需要选择一个与您的对象的MT对应的地址,然后调用!gcroot (your-address)以查看保持对象存活的内容。

在大多数情况下,对象保持活动状态,因为其中一个方法被注册为某个其他对象事件的事件处理程序。一个好的做法是在不再需要对象时始终从父类中分离事件处理程序。

答案 1 :(得分:1)

由于它是一个网络服务器,我会创建一个强制GC的虚拟页面处理程序。如果内存不会被释放,泄密嫌疑人可能会很严重。

之后,真正的问题是泄漏的地方