我使用以下方法在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
我可以看到流程限制是无限的。可能是什么问题呢?
答案 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。