如何解决“java.io.IOException异常:错误= 12,无法分配内存”调用运行#的exe

2019-06-14 08:20发布

在我的系统不能运行启动的过程的简单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

Answer 1:

什么是你的机器的内存配置文件? 例如,如果你运行的top ,有多少可用内存,你呢?

我怀疑UnixProcess执行fork() ,它根本就不是从操作系统获得足够的内存(如果没有记错,它会fork()复制的过程,然后exec()来运行新的存储过程的LS,它是没有得到至于那)

编辑:回复。 您过量使用的解决方案,它允许系统内存造成过度,可能允许进程分配(但不使用)更多的内存比实际可用。 所以我想的是, fork()复制Java进程内存在下面的意见进行讨论。 当然,由于“LS”取代了重复的Java进程不使用的内存。



Answer 2:

这是解决方案,但你必须设置:

echo 1 > /proc/sys/vm/overcommit_memory


Answer 3:

这是在Java版本1.6.0_23及以上的解决。

看到更多细节http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7034935



Answer 4:

Runtime.getRuntime().exec分配用相同量的存储器中作为主要的处理。 如果你有你堆设置为1GB,并尝试给exec那么它将会分配另一个1GB该进程来运行。



Answer 5:

我碰到这些链接:

http://mail.openjdk.java.net/pipermail/core-libs-dev/2009-May/001689.html

http://www.nabble.com/Review-request-for-5049299-td23667680.html

似乎是一个错误。 一个菌种的用法()技巧,而不是普通的叉()/ EXEC()被劝告。



Answer 6:

我解决了这个使用JNA: https://github.com/twall/jna

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public class prova {

    private interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
        int system(String cmd);
    }

    private static int exec(String command) {
        return CLibrary.INSTANCE.system(command);
    }

    public static void main(String[] args) {
        exec("ls");
    }
}


Answer 7:

如果你看看java.lang.Runtime中的源代码,你会看到EXEC最后调用保护方法:execVM,这意味着它使用虚拟内存。 因此,对于类Unix系统,VM取决于交换空间量+的物理存储器中的某些比值。

迈克尔的回答并解决你的问题,但它可能(或者说,最终会)导致自1个推荐操作系统内存分配问题上的OS僵局少小心内存分配和0的只是猜测和明明,你是幸运的,OS猜你可以有记忆这个时候。 下次? 嗯.....

更好的办法是,你尝试你的情况和提供一个良好的交换空间和给予的使用和设定值设置为2,而不是1或0的物理内存更好的比率。



Answer 8:

overcommit_memory

控制过量使用的系统内存,可能允许进程分配(但不使用)更多的内存比实际可用。

0 - 启发式过量使用处理。 地址空间明显overcommits被拒绝。 用于一个典型的系统。 它可确保同时允许过量使用,以减少交换空间使用率进行认真野生分配失败。 根被允许在此模式下分配性能稍微更多的内存。 这是默认的。

1 - 总是过量使用。 适合一些科学应用。

2 - 不要过量使用。 总的地址空间为提交系统不允许超过交换加物理RAM的配置百分比(默认为50)。 根据您所使用的百分比,在大多数情况下,这意味着在尝试使用已分配的内存中的进程将不会被杀死,但会收到内存分配错误适当。



Answer 9:

您可以使用狸包装产卵与POSIX重生,而不是创建一个进程。 http://wrapper.tanukisoftware.com/doc/english/child-exec.html

所述WrapperManager.exec()函数是具有的缺点为使用fork()的方法,该方法可以成为在某些平台上非常昂贵存储器要创建新的进程的替代Java的的Runtime.exec()。



Answer 10:

怪异,因为这听起来,一个解决办法是减少分配给JVM的内存量。 由于fork()的复制过程,它的内存,如果你的JVM进程并不真正需要的是通过-Xmx分配尽可能多的内存,内存分配到git会工作。

当然,你可以试试这里所说的(如过度承诺或升级到具有修复JVM)其他解决方案。 您可以尝试降低内存,如果你是绝望的,保持所有软件完整,没有环境的影响的解决方案。 此外,还要注意减少-Xmx积极地会导致奥姆斯。 我建议你升级JDK作为长期稳定的解决方案。



文章来源: How to solve “java.io.IOException: error=12, Cannot allocate memory” calling Runtime#exec()?