我正在处理一些可能早于 .NET 2 的遗留代码。库本身是我们的服务器使用的自定义异步 TCP 通信层。
那里有一个继承自 System.Net.Sockets.TcpClient
的类以及围绕它实现处置模式和终结器(后者可能不需要)的整个类层次结构。
我的问题是关于在处理 TCP 客户端断开连接事件的方法中发现的可疑代码行:
// Hack to ensure that client has disconnected
GC.Collect();
这是在调用处理我们的通信类层次结构的方法之后执行的,最终调用 System.Net.Sockets.TcpClient Dispose
方法。
在可以为许多客户端提供服务并使用千兆字节 RAM 的 64 位服务器上,这些调用可能非常昂贵。我找不到任何有关在 TCP 客户端断开连接时强制进行垃圾收集的信息?
最佳答案
使用 GC.Collect()
强制 GC 后会发生两件事。
- 没有终结器的无法访问的对象所使用的内存将被回收。
- 实现终结器的对象将被放入终结器队列,很快就会执行终结器。
评论表明 GC.Collect()
不是调用来回收内存,而是执行终结器来处理非托管资源。
如果正确使用IDisposable
,就不需要依赖终结器。可能有一些 IDisposable
对象未正确 Dispose
d。你必须找到他们。一种方法是检查执行了哪些终结器。一些内存分析器也可以跟踪此类对象(例如 .NET memory profiler's Dispose Tracker)。
关于c# - 为什么我要在 TCP 客户端关闭后强制进行垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34185318/