绑定状态下的套接字过多

时间:2012-07-25 15:50:12

标签: java sockets

在我们的一个客户系统中,我们面临太多的打开文件错误,目前FD限制设置为最大值,这种情况每周发生一次。

在看到lsof和netstat o / p之后,我能够看到太多套接字处于BOUND状态(20K)。据我所知,这种状态是一种暂态,我无法找到它实际泄漏的地方。当我在heapDump中看到一个有界套接字时,我看到以下GC引用

>java.net.InetSocketAddress
 >> sun.nio.ch.SocketChannelImpl
  >>>sun.nio.ch.SocketAdaptor
   >>>>java.net.SocksSocketImpl
    >>>>>java.lang.ref.Finalizer 

我不知道如何解决这个问题。我需要专家意见吗?

3 个答案:

答案 0 :(得分:3)

要确保套接字关闭()d,它将从Finalizer线程关闭。

Finalizer线程是单线程的,如果运行缓慢(例如因为你没有正确关闭连接),你可以比清理它们更快地创建套接字。

要检查的第一件事是进行堆栈转储,看看终结器线程通常在等待什么。其次,检查始终关闭套接字连接。套接字仍将被添加到Finalizer队列,但他们不会花时间检查它们是否已经关闭。

答案 1 :(得分:1)

你正在严重漏掉插座。你不应该在某个地方关闭它们。我会从BOUND状态猜测你正在调用新的Socket(),然后调用connect(),如果失败则你没有关闭套接字,但可能有很多其他的可能性。

答案 2 :(得分:0)

感谢提示,我们能够挖掘出这个问题。 。实际上nio抛出了一个未经重复的地址异常,在这种情况下,soket资源没有被清除,但是当IOException被引发时,每个资源都被清理并释放,现在我们只处理了UnresolvedAddressException。 。修复很简单,但需要时间归结为问题:)