我写了一个小的Server类,它基本上是TcpListener包装器和ThreadPool线程生成器.
线程运行Server :: ProcessMessage(),该服务器执行一些工作来回发送消息,然后在其末尾退出.
但是在退出该函数之前,我还调用了TcpClient.GetStream().Close(),然后调用了TcpClient.Close().我不使用任何Mutex或ManualResetEvent WaitHandles.
测试了客户端和服务器,一切正常,除了在任务管理器中,它显示内存使用率在每个Server :: ProcessMessage()上都在不断增加.即使在断开所有客户端应用程序的连接并关闭它们之后,“内存使用情况”仍然存在,并且没有减少.
服务器作为Windows服务运行.
我怎么知道这是内存泄漏的迹象,还是只是垃圾收集器未完成其工作?
谢谢.
编辑:
我想我找到了“内存泄漏”的原因.我的Server :: ProcessMessage()中有Console.WriteLine().如果有更简单的方法来检查内存问题,那还是有帮助的.
解决方法:
尝试使用扩展名为SoS的WinDbg,检查是否为unneeded objects are still referenced in the heap.还要检查this link.
通常,您首先使用!DumpHeap -type(some-type-or-just-namespace)来获取某种类型的对象的列表(我通常只是编写相关层的名称空间来获取我认为可能是列表或对象的列表)仍在记忆中).
如果某个对象的实例有多个,则需要选择一个与对象的MT对应的地址,然后调用!gcroot(您的地址)以查看使对象保持活动状态的原因.
在大多数情况下,对象会保持活动状态,因为它们的方法之一已注册为其他对象事件的事件处理程序.一个好的做法是,在不再需要对象时,始终将事件处理程序与父类分离.