在linux环境中,当执行到
Process p = Runtime.getRuntime().exec(cmdArr);
时,打印如下错误:
java.io.IOException: Cannot run program "/opt/xxxx": java.io.IOException: error=12, Cannot allocate memory
有那位对linux环境比较熟悉的给点建议啊
Process p = Runtime.getRuntime().exec(cmdArr);
时,打印如下错误:
java.io.IOException: Cannot run program "/opt/xxxx": java.io.IOException: error=12, Cannot allocate memory
有那位对linux环境比较熟悉的给点建议啊
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 javafree结果如下:
total used free shared buffers cached
Mem: 6108084 5759972 348112 0 46108 249956
-/+ buffers/cache: 5463908 644176
Swap: 2104472 0 2104472
此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