当前位置: 首页 > article >正文

FD(File Descriptor)泄漏

File Descriptor是Linux下概念,fd 是 int类型非负数!

进程打开File,Socket,Pipe后生成一个File Descriptor,它是打开这个系统资源的标识符。

Linux每个进程fd最大1024个,超过之后进程 crash,crash堆栈如下:

  •  使用匿名共享内存

E AndroidRuntime: java.lang.Error: java.io.IOException: SharedMemory_create failed: EMFILE (Too many open files)

F DEBUG : Abort message: 'FORTIFY: FD_SET: file descriptor 1462 >= FD_SETSIZE 1024'

  • 使用fd = open(filename, O_RDONLY) 打开文件

返回fd变量场景如下:

  1. epoll初始化:fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC) / fd = epoll_create1(EPOLL_CLOEXEC)
  2. 打开文件:fd = open(filename, O_RDONLY)
  3. 共享内存:fd = getParcelFileDescriptor(new MemoryFile(

还有更多隐蔽的生成了fd,如:new Socket,new Thread,new PipedOutputStream‘

如何监控fd泄漏?

  • StrictMode
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads()
    .detectDiskWrites()
    .detectNetwork() // or .detectAll() for all detectable problems
    .penaltyLog()
    .build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
    .detectLeakedSqlLiteObjects()
    .detectLeakedClosableObjects()
    .penaltyLog()
    .penaltyDeath()
    .build());
  • 脚本定时读取fd:本地写shell/python脚本定时读取proc/pid/fd
  • shell命令读取fd总量或fd列表
 lsof -n -p pid  | wc -l 

fd标识符和泄漏文件类型关系

类型fd标识符
网络请求Socket
HandlerThreadanon_inode:[eventpoll]和anon_inode:[eventfd]成对出现
in/output打开文件

/data/data/x,/data/app/x,/storage/emulate/0/x

例如 File(cacheDir, "file").createNewFile()

打开数据库文件/dev/ashmem
InputChannel泄露时增加明显anon_inode:[dmabuf]
线程

FD泄漏优化:

  • HandlerThread用完后要关闭(HandlerThread::quitSafely()/HandlerThread::quit())
  • 减少window数量:每增加1个window上涨10个fd
  • 停止无用的线程:1个线程增加1个fd

http://www.kler.cn/a/453780.html

相关文章:

  • 虚幻引擎结构之TArray
  • niushop开源商城靶场漏洞
  • 高校网络安全存在的问题与对策研究
  • PCB注意事项
  • mac 关闭 sip
  • new_event_loop k8s 不显示log
  • 真实环境下实车运行,新能源汽车锂离子电池数据集
  • 同源策略详解
  • windows安装vmware
  • Flink 集群有哪些⻆⾊?各⾃有什么作⽤?
  • 【MySQL】MySQL表的约束
  • Spring Security3.0.2.1版本
  • Leetcode - 146双周赛
  • Milvus×EasyAi:如何用java从零搭建人脸识别应用
  • AI新书推荐:深度学习和大模型原理与实践(清华社)
  • 深度解析:Maven 和 Gradle 的使用比较及常见仓库推荐
  • 单片机里不想阻塞系统的延时
  • DBeaver 咋手动配置sqlite 驱动
  • QT--静态插件、动态插件
  • 【递归,搜索与回溯算法 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)