关于android中的too many open files(error 24)

    在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时,程序就挂了。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值