环境
- 芯片:海思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);
海思平台遇到同样坑的,可以看下。