.NET 内存泄漏会导致端口耗尽吗?

.NET 内存泄漏会导致端口耗尽吗?

我们的网络服务器由于端口耗尽而出现问题。这种情况每两周发生一次,重新启动即可解决问题。但我想彻底解决这个问题,并找到一个永久的解决方案以避免重新启动。

我读本文它确实很有用。但是,它提到了这一点:

因此,如果你看到一个进程占用了大量端口,与一个或多个远程地址通信,并且连接状态为 TIME_WAIT,这通常表明该进程出现了问题,没有正确释放这些端口

(重点是我的)

再往下还有这样一段话:

我上面提到过,内存泄漏也会导致这种行为——究竟为什么会这样?发生的情况是,为了获得用于出站连接的端口,进程需要获取该端口的句柄。该句柄来自非分页池内存。因此,如果发生内存泄漏,并且用完了非分页池,需要与网络上的其他机器通信的进程将无法获取句柄,因此无法获取所需的端口。

问题

  1. 作者的意思是什么没有正确释放这些端口? 那是谁的工作?程序员?
  2. 有人可以详细说明内存泄漏可能导致什么吗端口耗尽因为我读完上面的内容之后还是不确定?

最后要记住的事情是,我是一名程序员,而不是管理员(如果这有任何帮助的话)。

答案1

  1. 是的,这是程序员的工作。
  2. 是的,内存泄漏可能会导致这种情况。问题是如果套接字没有明确关闭它只在 Socket 或其他派生类的实例被关闭时才关闭被毁坏. 这是通过垃圾收集自动,但是如果某处至少留有一个引用(内存泄漏),它将不会销毁类的实例。

找出是什么保留了对实例的引用并导致内存泄漏可能相当棘手。可能是仍在运行的线程在其局部变量中保留了引用。可能是某种用于跟踪所有连接的数组。有很多可能性,它们都取决于实现。

相关内容