标签:memory-leaks tcpclient tcplistener c
我写了一个小的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(您的地址)以查看使对象保持活动状态的原因.
在大多数情况下,对象会保持活动状态,因为它们的方法之一已注册为其他对象事件的事件处理程序.一个好的做法是,在不再需要对象时,始终将事件处理程序与父类分离.
标签:memory-leaks,tcpclient,tcplistener,c 来源: https://codeday.me/bug/20191208/2089486.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。