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

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

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

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

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

服务器作为Windows服务运行。

我怎么知道它是否是内存泄漏的迹象,或者只是垃圾收集器没有完成其工作(还)?

谢谢。

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

尝试使用带有SoS扩展名的WinDbg来检查是否仍然在堆中引用了不需要的对象 。 也请查看此链接 。

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

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

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

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

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