获取错误 - 打开socket时出错:java.net.SocketException:我的应用程序打开的文件过多

时间:2017-08-09 10:16:43

标签: java sockets soap

从我的应用程序中,创建了大约10535个线程,每个线程都进行一次soap调用以获得响应

以下是错误跟踪。这是由于服务器无法处理这么多请求吗?如果是,我该如何解决?

[SOAPException: faultCode=SOAP-ENV:Client; msg=Error opening socket: java.net.SocketException: Too many open files; targetException=java.lang.IllegalArgumentException: Error opening socket: java.net.SocketException: Too many open files]
    at org.apache.soap.transport.http.SOAPHTTPConnection.send(SOAPHTTPConnection.java:354)
    at org.apache.soap.messaging.Message.send(Message.java:123)

1 个答案:

答案 0 :(得分:2)

问题的根本原因是:

  

从我的应用程序中有大约10535个线程......

这简直太疯狂了。通过运行大量线程,您无法获得改进的性能。可能相反,因为这些线程中的每一个都有一个线程堆栈和堆上的对象。并且所有内存的开销,许多活动对象的GC开销,线程上下文切换,争用等都将是重要的。

每个线程都有一个Socket,在内核中占用文件描述符和资源。

我建议您使用工作队列和工作线程的有界池。这样做的简单方法是使用ExecutorService;阅读javadocs

如果您真的坚持这样做,您将需要了解如何增加每个进程的操作系统级别的打开文件数。解决方案取决于您的操作系统。但是这个限制是由OS而不是Java强制执行的,你无法在JVM中解决它。

另见: