获取错误-打开套接字时出错:java.net.SocketException:我的应用程序中打开的文件太多

获取错误-打开套接字时出错:java.net.SocketException:我的应用程序中打开的文件太多,java,sockets,soap,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: Er

在我的应用程序中,创建了大约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)

问题的根本原因是:

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

这简直是疯了。通过运行大量线程,您无法提高性能。可能恰恰相反,因为每个线程都有一个线程堆栈和堆上的对象。所有这些内存的开销,那么多活动对象的GC开销,线程上下文切换,争用等等都是非常重要的

每个线程都有一个套接字,它消耗内核中的文件描述符和资源

我建议您使用一个工作队列和一个有边界的工作线程池。实现这一点的简单方法是使用
执行器服务
;阅读


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

另见:


    • 问题的根本原因是:

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

      这简直是疯了。通过运行大量线程,您无法提高性能。可能恰恰相反,因为每个线程都有一个线程堆栈和堆上的对象。所有这些内存的开销,那么多活动对象的GC开销,线程上下文切换,争用等等都是非常重要的

      每个线程都有一个套接字,它消耗内核中的文件描述符和资源

      我建议您使用一个工作队列和一个有边界的工作线程池。实现这一点的简单方法是使用
      执行器服务
      ;阅读


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

      另见: