成都网站建设详细内容,在线免费做网站,德城区建设局网站,上海设计展2021室内设计android FD_SET_chk问题定位 一、FD报错二、问题定位2.1 APM定位2.2 adb定位2.3. 代码获取FD数 三、FD优化 一、FD报错
App在运行中记录报错如下#xff0c;FD_SET#xff0c;这个问题大概是文件描述符#xff08;File Descriptor#xff0c;简称FD#xff09;超过了最大… android FD_SET_chk问题定位 一、FD报错二、问题定位2.1 APM定位2.2 adb定位2.3. 代码获取FD数 三、FD优化 一、FD报错
App在运行中记录报错如下FD_SET这个问题大概是文件描述符File Descriptor简称FD超过了最大限制数说明App内可能存在FD泄漏。
二、问题定位
2.1 APM定位
由于App使用了火山APM监测找到此对应崩溃信息中的Native信息可以看到FD归类已超过1024个每个手机的可打开的最大FD不同。而大部分集中在data中data里存在大量创建文件没有关闭造成FD超过1024.
2.2 adb定位
// 1.先查询到App包名对应的pid
adb shell ps
// 2.cat /proc/pid/limits 查看最大可开启的文件数找到open files FD、lock files 文件锁// 3. adb shell ls -l /proc/pid/fd需要root权限
adb shell ls -l /proc/988/fd2.3. 代码获取FD数
使用StrictMode框架定位具体代码占用fd搜索日志TAG StrictMode 定位出问题的代码 StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build())StrictMode.setVmPolicy(StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build())直接代码获取fd数
private fun printFdInfo() {val pid android.os.Process.myPid()val fdDir File(/proc/$pid/fd)if (fdDir.isDirectory) {val files fdDir.listFiles()if (files ! null) {Log.d(FD_INFO, 进程 pid 当前打开的文件描述符数量: files.size)for (file in files) {try {val filePath file.canonicalPathLog.d(FD_INFO, 文件描述符: file.name - filePath)} catch (e: IOException) {Log.e(FD_INFO, 获取文件描述符信息失败, e)}}}} else {Log.e(FD_INFO, 无法访问 /proc/$pid/fd 目录)}}三、FD优化
数据库不要过多数据库设计要精简合理App退出时及时关闭文件操作完毕后要及时close避免大量创建文件使用缓存的文件进行操作Socket请求、Http请求尽量避免轮询