为什么我要在TCP客户端关闭后强制进行垃圾收集

本文关键字:我要 TCP 客户端 为什么 | 更新日期: 2023-09-27 18:26:13

我正在处理一些可能早于.NET2的遗留代码。库本身是我们的服务器使用的自定义异步TCP通信层。

那里有一个从System.Net.Sockets.TcpClient继承的类,以及它周围的整个类层次结构,它实现了处置模式和终结器(后者可能不需要)。

我的问题是关于在处理TCP客户端断开连接事件的方法中发现的可疑代码行:

// Hack to ensure that client has disconnected
GC.Collect();

它是在调用处理我们的通信类层次结构的方法之后执行的,该通信类层次最终调用CCD_。

在一个可以为许多客户端提供服务并使用千兆字节RAM的64位服务器上,这些调用可能非常昂贵。我找不到任何关于在TCP客户端断开连接时强制垃圾收集的信息?

为什么我要在TCP客户端关闭后强制进行垃圾收集

使用GC.Collect()强制GC后会发生两件事。

  1. 没有终结器的不可访问对象所使用的内存将被回收
  2. 实现终结器的对象将被放置在终结器队列中,并且终结器将很快执行

注释表明,调用GC.Collect()不是为了回收内存,而是为了执行终结器来处置非托管资源。

如果IDisposable使用正确,就不需要依赖终结器。可能有一些IDisposable对象不是正确的Disposed。你必须找到他们。一种方法是检查执行了哪些终结器。一些内存探查器也可以跟踪此类对象(例如.NET内存探查器的Dispose Tracker)。