2017-08-09 95 views
0

从我的应用程序打开的文件太多,有创造了约10535线程,每个线程进行SOAP调用得到回应得到错误 - 错误打开插座:java.net.SocketException异常:从我的应用程序

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

[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) 
+2

https://stackoverflow.com/questions/651665/how-many-socket-connections-possible – Ouney

回答

2

你的问题的根本原因是这样的:

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

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

并且每个thos线程都有一个Socket,在内核中消耗一个文件描述符AND资源。

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


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

参见:

相关问题