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