-
Notifications
You must be signed in to change notification settings - Fork 3
/
难问题
31 lines (29 loc) · 2.04 KB
/
难问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
问题1.调用Camera扫码交易的过程中偶现内核报句柄数超过最大数
查找过程:
1.首先分析错误日志,提示大概意思就是打开的文件句柄过多,
这种情况因为是偶现,概率低,很难复现,但是又一定会出现,当时也让测试做了很多测试都没得到想要的结果,客户催的急
2.在第一步无法解决的情况,那就只能深入内核查看,因为对内核来说一切皆文件,所以我们找到报错的文件/proc/self/fd,
这个文件主要作用是存储打开的文件句柄,如果超过一定数量的时候再打开文件就会显示too many open files的错误,
3.根据第二步的分析,我们写了一段代码去获取这个文件内容,
public void saveJu(String fileName){
try{
String savePath = Environment.getExternalStorageDirectory() + File.separator + "allinpay"
+ File.separator + fileName;
FileOutputStream fos = new FileOutputStream(new File(savePath));
File fddir = new File("/proc/self/fd");
int count = 0;
for(File file:fddir.listFiles()){
Date lasmodify = new Date(file.lastModified());
String line = String.format("%s -> %s -> %s\n", file.getName(), lasmodify.toString(), file.getCanonicalPath());
fos.write(line.getBytes());
count += 1;
}
fos.close();
}catch (Exception e){
e.printStackTrace();
}
}
4.做了20笔交易,大概产生了90快100个句柄,很明显这是一种文件打开没释放的错误操作导致。
5.在分析了句柄的内容后,发现多了很多/proc/31485/fd/pipe:[895109],然后查找代码里面对文件和线程的操作,也分析了是否是用了强引用handler导致的,
最后得出结论是因为在主线程中直接new了一个线程,在这个子线程中使用了高德的定位功能,高德定位会新建一个线程一直占用这个线程不退出,导致机器卡顿,甚至崩溃。
解决方案:在主线程中调用高德的定位,并在使用完成后在Activity的ondestory中停止定位,这样就不会引起内存泄露。