从我的应用程序中,创建了大约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)
答案 0 :(得分:2)
问题的根本原因是:
从我的应用程序中有大约10535个线程......
这简直太疯狂了。通过运行大量线程,您无法获得改进的性能。可能相反,因为这些线程中的每一个都有一个线程堆栈和堆上的对象。并且所有内存的开销,许多活动对象的GC开销,线程上下文切换,争用等都将是重要的。
每个线程都有一个Socket,在内核中占用文件描述符和资源。
我建议您使用工作队列和工作线程的有界池。这样做的简单方法是使用ExecutorService
;阅读javadocs
如果您真的坚持这样做,您将需要了解如何增加每个进程的操作系统级别的打开文件数。解决方案取决于您的操作系统。但是这个限制是由OS而不是Java强制执行的,你无法在JVM中解决它。
另见: