记一次fdopen引起的内存泄漏

环境

  • 芯片:海思3798
  • 操作系统: Android7
  • 内核版本: 3.18.24

问题现象

运行"pp聚精彩"应用(com.pplive.androidxl)后,内存一直泄漏(泄漏数量可以达到1.6G),直至系统把它杀掉。

最终找到的原因

应用内部使用了so库,泄漏了。因为泄露的内存不再java虚拟机管理范围,所以可以飚到1个多G,否则如果是java层的泄漏,200多M就被干掉了。

void some_shit_func(int fd){
	char buf[8];
	int ffd = dup(fd);
	FILE *fp = fdopen(fd, "rb");
	fread(buf, 1, 8, fp);
	close(ffd);//这里是close,泄露了
}

以上代码换成下面就不会泄漏

void some_shit_func(int fd){
	char buf[8];
	int ffd = dup(fd);
	FILE *fp = fdopen(fd, "rb");
	fread(buf, 1, 8, fp);
	fclose(fp);//改用fclose
}

# fdopen后需要fclose吗?

经测试,fdopen后,不需fclose,不会造成句柄泄漏。在海思的板上通过lsof查看,也没有句柄泄漏。

那为什么海思的板子为啥泄漏了?

没有去查具体原因了,只知道海思的内核应该有问题。
fdopen后,必须对应一个fclose操作,否则会泄漏。

	FILE *fp = fdopen(fd, "rb");
	//我使用网络文件系统,这条语句还会触发mmap,将整个文件读到进程空间!!!
	//不管之前有没有映射过,只要fdopen后读,都重新给你来一次。
	fread(buf, 1, 8, fp);
	fclose(fp);
	//上面执行fclose后,无需close(fd)
	//close(fd);

海思平台遇到同样坑的,可以看下。

猜你喜欢

转载自blog.csdn.net/yinmingxuan/article/details/86658385