1 android 系统是基于linux系统上面, linux是一切皆文件的设计。可以代表文件、socket、pipe、memory、io等
2 fd 是file descriptor,是一个非负整数,是一个索引值,一个文件句柄
文件描述符0与进程的标准输入关联
文件描述符1与进程的标准输出关联
文件描述符2与进程的标准错误关联
3 linux系统对每个进程都有fd的数量限制, android 同样也有,android 的限制是1024.
4 当fd满了后,创建fd就会失败,并返回有些信息如:
Too many open files
5 造成的原因:
file 未close
HandlerThread 创建太多 且没退出,
------内部有looper、messageQueue,使用了cpp的looper,创建了epollfd和eventFd两个fd。
java Thread 创建太多,可能需要虚拟机,
------创建JNIENV需要打开Fd失败
InputChannel
----InputChannel使用Ashmem匿名共享内存来传递数据,它由一个fd文件描述符指向,同时read端和write端各占用一个fd
binder
--- binder 创建需要使用fd, parcel 传递data有些也需要fd
shared memory
--- 进程间数据共享
native_handle_t
---- fd 的共享
6 查看fd的情况
查看进程fd的打开情况, 会有fd对应的文件情况
ls -la /proc/{pid}/fd/
lsof命令打印指定进程或所有进程的fd信息
check fd的类型及执行的文件形式,分析哪些有泄漏
7 特别fd的数值较大时,发生泄漏的概率就很大