在android中,所有的IO操作最终都是需要句柄来操作文件实现的。句柄数量对于每一个app都有一个上限,常见的是1024个。一旦某个app同时使用的句柄数超过了这个限制,就会看到这个异常:too many open files。
这个问题坑爹的地方就在于超出限制时,到处都有可能会崩溃,有可能是cursor的查询,也有可能是new一个对象。而且只从log分析的话,句柄问题极难定位。
解决思路:句柄太多,那这些句柄来自哪里?搞清楚这个,问题自然就有结论。
那么如何查看句柄?
查看当前句柄详情:adb shell lsof -p <pid>
查看当前句柄总数:adbshell lsof -p <pid> |wc –l
自己可以写一个小的bat脚本,每隔1秒就存一次句柄详情,然后观察句柄的总数,当发现句柄只升不降时,对比早起的句柄详情和现在的句柄详情,就可以找到多出来的那些句柄是来自哪里了。
上面的过程可能比较繁琐耗时,说下我碰见的这个bug根本原因:线程泄露了。
app在有新应用安装的时候会启动一个线程来算MD5值,这个线程是个死循环。。。也就是说,每新安装一个apk就会多一个无线循环的thread,每个thread都会占用几个句柄,最终积累到1024时,程序就挂了。