执行Runtime.getRuntime().exec()时空间不足

迟一刀 2011-06-22 09:44:14
在linux环境中,当执行到
Process p = Runtime.getRuntime().exec(cmdArr);
时,打印如下错误:
java.io.IOException: Cannot run program "/opt/xxxx": java.io.IOException: error=12, Cannot allocate memory
有那位对linux环境比较熟悉的给点建议啊
...全文
457 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
inkinwolf 2012-01-18
  • 打赏
  • 举报
回复
是使用线程来执行么?
inkinwolf 2012-01-18
  • 打赏
  • 举报
回复
新启一个java进程?how to do?
迟一刀 2011-06-28
  • 打赏
  • 举报
回复
已解决。
此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
迟一刀 2011-06-23
  • 打赏
  • 举报
回复
上面的已看过,但是无法解决。

补充一下,问题的产生情况-一般情况下运行正常;当内存中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

chenchenyangll 2011-06-22
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/1124771/how-to-solve-java-io-ioexception-error-12-cannot-allocate-memory-calling-runt

这个应该能解决问题

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧