-5

在我们的项目中,我创建了很多 java 线程来做一些连续的工作。

在大多数情况下,这些线程都处于休眠状态,因此总 CPU 成本很低。

1168螺纹,system overload应低于 0.20

但后来我注意到,如果我用 jvm 创建超过 1000 个线程,那么我会得到

fork: retry: Resource temporarily unavailable

当我想连接vm(我的意思是虚拟机,不是jvm)时ssh,这似乎是一个关于系统资源的严重问题..

而且我非常担心我的程序中会发生什么..

4

2 回答 2

4

这么多线程看起来不像是一个好的设计。我建议在一个循环中接收当前唤醒您的线程的所有事件,这些事件可以立即将它们转换为Future或 Runnables 并发布到某个ExecutorService。该服务可以为您管理一个线程池。ServerSocket 和 Socket 的标准方法就是以这种方式实现的。

于 2013-01-26T16:48:01.353 回答
1

正如这里提到的,Linux 系统上的线程和进程的总数是有限的,直接间接通过其他资源限制。您显然超出了该限制,并且fork()创建新 SSH 会话所需的调用失败。

无论如何,您为什么要创建这么多线程?

当线程数显着超过可用处理器内核数时,您很少获得任何性能优势,并且每个线程确实具有不可忽略的最小内存要求集。

如果您正在处理某种形式的C10K问题,您应该考虑将多个线程与异步 I/O 的使用结合起来。

于 2013-01-26T16:41:14.800 回答