JDK1.6环境下,Cannot run program "...": java.io.IOException: error=12, Cannot allocate memory

背景:相册使用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已经得到修正。

 

参考资料:

bug描述和解决方案

此bug推测和源码分析(其中copy-on-write的机制不一定准确)

官方说法

你可能感兴趣的:(work,jdk)