Java 处于绑定状态的套接字太多
在我们的一个客户系统中,我们面临着太多的打开文件错误,目前FD限制设置为max,并且这种情况每周发生一次 在看到lsof和netstat o/p之后,我能够看到太多的套接字处于绑定状态(20K)。据我所知,这种状态是一种瞬态,我无法找到它的实际泄漏位置。当我在heapDump中看到其中一个绑定套接字时,我看到了以下GC引用Java 处于绑定状态的套接字太多,java,sockets,Java,Sockets,在我们的一个客户系统中,我们面临着太多的打开文件错误,目前FD限制设置为max,并且这种情况每周发生一次 在看到lsof和netstat o/p之后,我能够看到太多的套接字处于绑定状态(20K)。据我所知,这种状态是一种瞬态,我无法找到它的实际泄漏位置。当我在heapDump中看到其中一个绑定套接字时,我看到了以下GC引用 >java.net.InetSocketAddress >> sun.nio.ch.SocketChannelImpl >>>sun
>java.net.InetSocketAddress
>> sun.nio.ch.SocketChannelImpl
>>>sun.nio.ch.SocketAdaptor
>>>>java.net.SocksSocketImpl
>>>>>java.lang.ref.Finalizer
我不知道如何解决这个问题。我需要专家对这一点发表意见?以确保套接字是关闭的()d它是从终结器线程关闭的 终结器线程是单线程的,如果运行缓慢(例如,因为您没有正确关闭连接),则创建套接字的速度可能比清理套接字的速度快
首先要检查的是进行堆栈转储,看看终结器线程通常在等待什么。其次,检查您是否始终在完成套接字连接后关闭它们。套接字仍将添加到终结器队列,但它们不会花任何时间检查它们是否已关闭。要确保套接字已关闭(),它将从终结器线程关闭 终结器线程是单线程的,如果运行缓慢(例如,因为您没有正确关闭连接),则创建套接字的速度可能比清理套接字的速度快
首先要检查的是进行堆栈转储,看看终结器线程通常在等待什么。其次,检查您是否始终在完成套接字连接后关闭它们。套接字仍将添加到终结器队列中,但它们不会花任何时间检查它们是否已关闭。套接字泄漏严重。在某个地方,当你应该关闭它们时,你不会在最后一个街区关闭它们。我会从绑定状态猜测,在某个地方您正在调用new Socket(),然后调用connect(),如果失败,您就不会关闭a Socket,但可能还有许多其他的可能性。您正在严重泄漏套接字。在某个地方,当你应该关闭它们时,你不会在最后一个街区关闭它们。我会从绑定状态猜测,在某个地方您正在调用new Socket(),然后调用connect(),如果失败,您将不会关闭a Socket,但可能还有许多其他可能性。感谢您的提示,我们能够找出问题所在。实际上nio抛出了一个UnselvedAddress异常,在这种情况下,soket资源没有被清理,但当引发IOException时,所有资源都被清理并释放,现在我们只处理UnselvedAddressException。修复很简单,但需要时间才能归结为问题:)感谢您的提示,我们能够找出问题所在。实际上nio抛出了一个UnselvedAddress异常,在这种情况下,soket资源没有被清理,但当引发IOException时,所有资源都被清理并释放,现在我们只处理UnselvedAddressException。修复很简单,但需要时间才能归结为问题:)感谢您的提示,我们能够找出问题所在。实际上nio抛出了一个UnselvedAddress异常,在这种情况下,soket资源没有被清理,但当引发IOException时,所有资源都被清理并释放,现在我们只处理UnselvedAddressException。修复很简单,但需要时间才能归结为问题:)感谢您的提示,我们能够找出问题。实际上nio抛出了一个UnselvedAddress异常,在这种情况下,soket资源没有被清理,但当引发IOException时,所有资源都被清理并释放,现在我们只处理UnselvedAddressException。修复很简单,但需要时间才能归结为问题:)