背景:相册使用JDK1.6,每运行一段时间,相册的resin就会报错:Cannot run program "...": java.io.IOException: error=12, Cannot allocate memory。
项目通过shell命令调用了第三方图片处理工具gm
排查过程:
0、通过top查看系统的进程,以及大致剩余的内存量:出现问题时,空闲内存还有1G以上;
1、观察gm程序使用的内存状态:gm的内存使用量一般在60M以内,在5M~60M间波动;
2、手动执行gm命令,同时观察resin的输出:resin仍然提示无法调用gm命令,但手动执行是正常的;
3、查看了系统中的程序数量,打开的文件数,都正常;
4、无头绪时,找到了一个说法:linux JDK1.6环境,通过Runtime.getRuntime().exec()执行第三方的程序时,先会在机器进行一次fork,fork的对象是被调用程序的父进程。在这里,也就相当于相册在调用gm命令时,先会申请一个跟resin一样大的内存空间。而resin一般占用的内存还是挺多的,这样一来,就调用失败了。
这个问题在JDK1.7已经得到修正。
参考资料: