在我们的一个客户系统中,我们面临着打开文件过多的错误,目前 FD 限制设置为最大值,并且这种情况每周发生一次。
在看到 lsof 和 netstat o/p 之后,我能够看到太多套接字处于绑定(bind)状态 (20K)。据我所知,这种状态是一种 transient ,我无法找到它实际泄漏的位置。当我在 heapDump 中看到有界套接字之一时,我看到以下 GC 引用
>java.net.InetSocketAddress
>> sun.nio.ch.SocketChannelImpl
>>>sun.nio.ch.SocketAdaptor
>>>>java.net.SocksSocketImpl
>>>>>java.lang.ref.Finalizer
我不知道如何解决这个问题。我需要专家的意见吗?
最佳答案
为了确保套接字是 close()d,它是从 Finalizer 线程关闭的。
Finalizer 线程是单线程的,如果它运行缓慢(例如,因为您没有正确关闭连接),您创建套接字的速度可能比清理套接字的速度快。
首先要检查的是堆栈转储,看看终结器线程通常在等待什么。其次,检查您是否总是在使用完套接字连接后关闭它们。套接字仍将添加到终结器队列中,但它们不会花任何时间检查它们是否已关闭。
关于java - 绑定(bind)状态的套接字太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11653688/