我应该在虚拟机中使用多少个线程?

时间:2013-01-26 16:36:47

标签: java linux multithreading

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

大多数时候这些线程都在休眠,因此总cpu成本很低。

带有1168个帖子的

system overload应低于0.20

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

fork: retry: Resource temporarily unavailable

当我想通过vm连接jvm(我的意思是 VM ,而不是ssh)时,这似乎是一个关于系统资源的严重问题。

我非常担心我的节目会发生什么......

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

如上所述here,Linux系统上的线程和进程数量有限,直接通过其他资源限制直接。您显然已超过该限制,并且创建新SSH会话所需的fork()调用失败。

为什么要创建这么多线程?

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

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