在我的系统上,我无法运行启动流程的简单Java应用程序。我不知道该怎么解决。
你能给我一些解决方法的提示吗?
该程序是:
[root@newton sisma-acquirer]# cat prova.java import java.io.IOException; public class prova { public static void main(String[] args) throws IOException { Runtime.getRuntime().exec("ls"); } }
结果是:
[root@newton sisma-acquirer]# javac prova.java && java -cp . prova Exception in thread "main" java.io.IOException: Cannot run program "ls": java.io.IOException: error=12, Cannot allocate memory at java.lang.ProcessBuilder.start(ProcessBuilder.java:474) at java.lang.Runtime.exec(Runtime.java:610) at java.lang.Runtime.exec(Runtime.java:448) at java.lang.Runtime.exec(Runtime.java:345) at prova.main(prova.java:6) Caused by: java.io.IOException: java.io.IOException: error=12, Cannot allocate memory at java.lang.UNIXProcess.<init>(UNIXProcess.java:164) at java.lang.ProcessImpl.start(ProcessImpl.java:81) at java.lang.ProcessBuilder.start(ProcessBuilder.java:467) ... 4 more
系统配置:
[root@newton sisma-acquirer]# java -version java version "1.6.0_0" OpenJDK Runtime Environment (IcedTea6 1.5) (fedora-18.b16.fc10-i386) OpenJDK Client VM (build 14.0-b15, mixed mode) [root@newton sisma-acquirer]# cat /etc/fedora-release Fedora release 10 (Cambridge)
编辑:解决方案 这解决了我的问题,我不知道为什么:
回声0> / proc / sys / vm / overcommit_memory
谁能解释的投票:)
附加信息,顶部输出:
top - 13:35:38 up 40 min, 2 users, load average: 0.43, 0.19, 0.12 Tasks: 129 total, 1 running, 128 sleeping, 0 stopped, 0 zombie Cpu(s): 1.5%us, 0.5%sy, 0.0%ni, 94.8%id, 3.2%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1033456k total, 587672k used, 445784k free, 51672k buffers Swap: 2031608k total, 0k used, 2031608k free, 188108k cached
附加信息,免费输出:
[root@newton sisma-acquirer]# free total used free shared buffers cached Mem: 1033456 588548 444908 0 51704 188292 -/+ buffers/cache: 348552 684904 Swap: 2031608 0 2031608
你的机器的内存配置文件是什么?例如,如果你跑步top,那么你有多少可用内存?
top
我怀疑UnixProcess执行a fork()只是从操作系统中获取不到足够的内存(如果有内存可用,它将fork()复制该进程,然后exec()在新的内存进程中运行ls,而且还没有达到目的)
UnixProcess
fork()
exec()
编辑:重新。你的过量使用解决方案,它允许过量使用系统内存,可能允许进程分配(但不使用)超过实际可用内存的内存。因此,我猜想这些fork()重复项将重复下面的注释中讨论的Java进程内存。当然,你不会使用内存,因为“ ls”将替换重复的Java进程。