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

标签 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)

最佳答案

问题的根本原因是:

From my application there are about 10535 threads ...

这简直太疯狂了。您不可能通过运行大量线程来提高性能。可能恰恰相反,因为每个线程都有一个线程堆栈和堆上的对象。所有这些内存的开销、许多 Activity 对象的 GC 开销、线程上下文切换、争用等都将是巨大的。

每个线程都有一个 Socket,消耗内核中的文件描述符和资源。

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

<小时/>

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

另请参阅:

关于java - 收到错误 - 打开套接字时出错 : java.net.SocketException:我的应用程序中打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45587835/

相关文章:

java - 如何在 ant 的 build.xml 中设置 -Dfile.encoding?

java - HTTP 状态 500 - Servlet.init()

c++ - Android 到 Windows 的 tcp 通信延迟

java - 用Java计算递归函数

c# - 如何使用 SuperWebSocket 创建 WebSocket 服务器

c - 将数据从 iphdr 传递到结构

java - PayPal:callBack url 和 returnurl 有什么区别?

c# - 使用 SOAP Web 引用将 C# 类编译为 .dll 错误 CS0234

php - PHP 中的 SOAP 服务器错误 - 从类中添加函数

java - XPages:服务器端生成JSON,使用客户端