现在的位置: 首页 > 综合 > 正文

Runtime.getRuntime().exec 导致的内存溢出

2013年08月26日 ⁄ 综合 ⁄ 共 629字 ⁄ 字号 评论关闭

公司的项目有个奇怪现象,运行在android 3.0以上的程序,会出现内存泄露问题。于是,开始解决问题。

首先,按照过去的经验,查看 客户端请求服务器 的代码,看是否有未关闭的请求连接,但最终排除。

其次,定位返回结果后的对象是否引用过多,系统无无法回收,但也没有问题。

最后,定位到字符串替换位置,就是一堆replace(str1,str2)的地方,按照理论,这里会导致N多字符串常量,但是想了想,也不至于导致内存泄露问题吧,否则的过去经验就白积累了。就在辗转只是,发现了几个方法,都是获得设备信息的。于是赶紧定位,发现了这个语句 Runtime.getRuntime().exec("cat /proc/cpuinfo")。这个就是网络流出来获得cpu信息的代码。

这个时候,突然想起来一个现象,就是没启动一个线程后,线程的资源不会释放,但是退出应用后,线程的ppid竟然变成了系统级别的。很奇特的现象,理论上,应用进程退出,属于他的线程会释放掉,但是这些线程不但没有释放,反而变成系统级别了。 通过以上现象,加上这个 Runtime.getRuntime().exec("cat /proc/cpuinfo")语句,感觉应该有点关系,于是网上查资料,发现这语句相当于控制台获得设备信息,也就是忘记关闭了控制台的连接。果断修改代码,在释放资源处,加入

if (pp != null) {
	pp.exitValue();
	pp.destroy();
}

再次运行,ok,资源释放掉了。问题解决。

抱歉!评论已关闭.