gpt4 book ai didi

c# - 为什么我要在 TCP 客户端关闭后强制进行垃圾回收?

转载 作者:可可西里 更新时间:2023-11-01 02:48:38 25 4
gpt4 key购买 nike

我正在处理一些可能早于 .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 后会发生两件事。

  1. 没有终结器的无法访问的对象所使用的内存将被回收。
  2. 实现终结器的对象将被放入终结器队列,很快就会执行终结器。

评论表明 GC.Collect() 不是调用来回收内存,而是执行终结器来处理非托管资源。

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

关于c# - 为什么我要在 TCP 客户端关闭后强制进行垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34185318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com