在linux环境中,当执行到
Process p = Runtime.getRuntime().exec(cmdArr);
时,打印如下错误:
java.io.IOException: Cannot run program "/opt/xxxx": java.io.IOException: error=12, Cannot allocate memory
有那位对linux环境比较熟悉的给点建议啊

解决方案 »

  1.   

    http://stackoverflow.com/questions/1124771/how-to-solve-java-io-ioexception-error-12-cannot-allocate-memory-calling-runt这个应该能解决问题
      

  2.   

    上面的已看过,但是无法解决。补充一下,问题的产生情况-一般情况下运行正常;当内存中load几百兆数据后,执行Runtime.exec()报错,即使执行的是任何一个简单指令譬如ls:
    java.io.IOException: Cannot run program "/opt/XXX": java.io.IOException: error=12, Cannot allocate memory
            at java.lang.ProcessBuilder.start(Unknown Source)
            at java.lang.Runtime.exec(Unknown Source)
            at java.lang.Runtime.exec(Unknown Source)。。
    Caused by: java.io.IOException: java.io.IOException: error=12, Cannot allocate memory
            at java.lang.UNIXProcess.<init>(Unknown Source)
            at java.lang.ProcessImpl.start(Unknown Source)
            ... 4 more此时top查看内存利用率接近90%,但按理应该还有空间可以执行
      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
     8925 root      19   0 6489m 5.1g  10m S  100 86.8   9:17.22 java
    free结果如下:
                 total       used       free     shared    buffers     cached
    Mem:       6108084    5759972     348112          0      46108     249956
    -/+ buffers/cache:    5463908     644176
    Swap:      2104472          0    2104472

      

  3.   

    已解决。
    此bug是由于在JDK1.6以前版本,Runtime.exec调用外部程序时使用fork()方式,需要分配和当前Java主进程同等大小的内存空间,也就是说将当前占用内存加倍。因此当Java程序占用内存超过50%时执行Runtime.exec永远不能成功。
    解决方法:
    1、新起一个Java进程,通过socket与主进程通信。这样运行Runtime.exec时只会将新进程内存加倍。
    2、坐等JDK1.7发布。该bug在JDK1.7中被Fix。http://blog.csdn.net/chifengxin/archive/2011/06/28/6573134.aspx
      

  4.   

    新启一个java进程?how to do?