猿问

如何解决调用Runtime#exec()的“ java.io.IOException:错误= 12

在我的系统上,我无法运行启动流程的简单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


翻过高山走不出你
浏览 744回答 3
3回答

狐的传说

您的机器的内存配置文件是什么?例如,如果您跑步top,那么您有多少可用内存?我怀疑UnixProcess执行a&nbsp;fork()只是从操作系统中获取不到足够的内存(如果有内存可用,它将fork()复制该进程,然后exec()在新的内存进程中运行ls,而且还没有达到目的)编辑:重新。您的过量使用解决方案,它允许过量使用系统内存,可能允许进程分配(但不使用)比实际可用内存更多的内存。因此,我猜想这些fork()重复项将复制Java进程内存,如以下注释中所述。当然,您不会使用内存,因为“ ls”将替换重复的Java进程。

犯罪嫌疑人X

Runtime.getRuntime().exec分配与主进程相同的内存量的进程。如果您将堆设置为1GB并尝试执行,那么它将为该进程分配另一个1GB的运行时间。
随时随地看视频慕课网APP

相关分类

Java
我要回答