句柄泄露
在linux中一个文件、一个串口、一个socket、一个线程都可以是一个文件,而一个文件会占用一个句柄,linux中一个进程默认的句柄最大数值是1024,当超过这个数值,linux就会对当前的进程进行kill,而kill的对象可以是任意对象,所以会造成各种异常原因的崩溃.
使用linux下的lsof命令,列出所有占用的句柄,
使用方式如下
1 |
2
3
4
5|adb shell
su
lsof
|
android下的lsof命令就是残废的
handlerThread虽然继承自Thread,但是它里面有looper,所以interrupt是不行的,这里需要调用quit()
通信的心跳service,如果连不上会每隔30s重新创建Connectmanager,并且旧的不销毁!
在重新连接前把旧的销毁掉。
遇到这种问题还是我们写代码不够规范造成的,输入输出流打开了一定要记得关闭,线程开启了如果不用了也要记得回收,还有一些对象如果需要重新初始化,那么旧的不用的对象也要回收,这样才能保证程序能够长久稳定的运行。我想:还好这个项目没有用到数据库,要不然可能还会遇到cursor的泄露
asset bundle分组策略/依赖打包/资源重复问题解决方案
- iOS File Handle Overuse
下一节中描述的问题是在Unity 5.3.2.p2中确定的。当前的统一版本不受这个问题的影响。
在Unity 5.3.2.p2之前的版本中,Unity会在加载AssetBundle的整个时间内,将一个打开的文件句柄保存到一个AssetBundle中。这在大多数平台上都不是问题。然而,iOS限制了一个进程可能同时打开到255的文件句柄的数量。如果加载一个AssetBundle导致这个限制被超过,那么加载调用将会因为“太多的打开文件句柄”错误而失败。
对于试图将其内容划分为数百或数千个assetbundle的项目来说,这是一个常见的问题。
对于无法升级到修补过的统一版本的项目,临时解决方案是:
通过合并相关的assetbundle来减少使用的assetbundle的数量
使用assetbundle.卸载(false)关闭AssetBundle的文件句柄,并手动管理加载的对象的生命周期