Java无法创建新进程:打开文件错误太多

时间:2012-02-14 08:49:16

标签: java file file-io

我使用以下方法在Java中启动了太多进程:

       Runtime.getRuntime().exec("java -ja myJar.jar")

当它达到大约350个进程时,我得到一个IO异常:

 Cannot run program "java": java.io.IOException: error=24, Too many open files
 Exception in creating process
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:475)
    at java.lang.Runtime.exec(Runtime.java:610)
    at java.lang.Runtime.exec(Runtime.java:448)
    at java.lang.Runtime.exec(Runtime.java:345)

在每个进程中,我使用一个数据库连接。 我正在运行ubuntu 32位操作系统。但是当我跑步时:

   ulimit -u 

我可以看到流程限制是无限的。可能是什么问题呢?

3 个答案:

答案 0 :(得分:1)

所有系统都有其限制 - 听起来你已达到系统的限制。

在linux中,创建新进程会消耗大量inodes(如windows 句柄),这很像文件句柄。唯一的方法是通过内核设置分配更多(我不知道如何随意)。

您是否考虑过开始大量的java Threads?它们会消耗更少的系统资源。

答案 1 :(得分:1)

问题是您打开的文件太多,而不是运行中的进程太多。要检查文件限制,请执行以下操作:

  

ulimit -n

通常为1024。

检查http://www.puschitz.com/TuningLinuxForOracle.shtml并搜索ulimit,以获取有关更改此限制的详细说明。

答案 2 :(得分:0)

运行350个JVM实例不是正常的方法。你能在同一个JVM中重新设计和运行350个“主线程”吗?这就是servlet容器的工作原理。所有Web应用程序都在同一JVM中运行。

PD。 ulimit man pages说要看max。打开的文件是ulimit -n。