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

本文分析了在JDK1.6环境下,通过Runtime.getRuntime().exec()调用第三方程序gm时出现的内存溢出问题。在相册项目中,此问题表现为无法分配内存,尽管系统仍有大量空闲内存。深入探究发现,问题根源在于JDK1.6执行fork操作时,会复制父进程(resin)的内存,导致内存不足。JDK1.7已对此问题进行修复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:相册使用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的机制不一定准确)

官方说法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值