浅谈FD泄漏

💡 原文中文,约8900字,阅读约需21分钟。
📝

内容提要

FD是文件描述符,用于唯一标识进程所打开的文件、管道或网络连接。在Android中,文件也可以是打印机、硬盘或网络接口。当进程打开或创建文件时,内核会返回一个fd。FD泄漏会导致进程崩溃。常见的泄漏场景包括输入输出流、Socket和Cursor等。处理方法包括及时释放资源和使用StrictMode进行排查。可以通过ulimit -n命令查看进程的最大可持有FD数量。

🎯

关键要点

  • FD是文件描述符,用于唯一标识进程所打开的文件、管道或网络连接。

  • 在Linux中,文件可以是打印机、硬盘或网络接口。

  • 进程打开文件时,内核返回一个fd。

  • FD泄漏会导致进程崩溃,常见泄漏场景包括输入输出流、Socket和Cursor。

  • 处理FD泄漏的方法包括及时释放资源和使用StrictMode进行排查。

  • 可以通过ulimit -n命令查看进程的最大可持有FD数量。

  • FD类型包括socket、anon_inode、pipe等。

  • FD数量有限,超出最大持有数后,应用会崩溃。

  • HandlerThread和Looper会创建多个FD,需注意释放。

  • 弹窗也可能导致FD泄漏,需及时关闭。

  • 使用StrictMode可以帮助排查FD泄漏问题。

  • 通过查看/proc/${pid}/fd可以获取进程持有的FD数量。

  • 线上监控FD数量,达到警戒值时进行分析。

  • 通过dumpsys window命令查看与窗口相关的FD泄漏。

延伸问答

什么是文件描述符(FD)?

文件描述符(FD)是一个非负整数,用于唯一标识进程所打开的文件、管道或网络连接。

FD泄漏会导致什么后果?

FD泄漏会导致进程崩溃,因为一个进程能持有的FD数量是有限的,超出最大持有数后,应用会崩溃。

如何检查进程的最大可持有FD数量?

可以通过执行命令ulimit -n来查看进程的最大可持有FD数量。

常见的FD泄漏场景有哪些?

常见的FD泄漏场景包括输入输出流、Socket和Cursor等。

如何处理FD泄漏问题?

处理FD泄漏的方法包括及时释放资源和使用StrictMode进行排查。

如何使用StrictMode排查FD泄漏?

可以通过设置StrictMode的线程策略和VM策略来检测文件读取、写入和Socket使用等问题,从而排查FD泄漏。

➡️

继续阅读