Android文件描述符泄漏debuging

时间:2016-03-30 09:25:52

标签: java android linux-kernel file-descriptor

我的公司我们有很多ui测试,它们运行在虚拟/真实设备上。运行一段时间之后测试随机崩溃,我认为这是文件描述符超出的结果:我用了

ls /proc/${PID}/fd | wc -llsof -p ${PID} 但它没有多大帮助 - lsof中的大多数行看起来像:

30015    u0_a104  678      sock                                    859560 socket:[859560]
30015    u0_a104  679      0000                0,8                 4539 anon_inode:[eventpoll]
30015    u0_a104  680      0000                0,8                 4539 anon_inode:[eventfd]
30015    u0_a104  681      0000                0,8                 4539 anon_inode:[eventfd]
30015    u0_a104  682      0000                0,8                 4539 anon_inode:[eventpoll]
30015    u0_a104  683      0000                0,8                 4539 anon_inode:[eventfd]
30015    u0_a104  684      0000                0,8                 4539 anon_inode:[eventpoll]
30015    u0_a104  685      0000                0,8                 4539 anon_inode:[eventfd]

所以我的问题是:是否有任何android / java / linux instruments / utils可以找到泄漏的

P.S。 System.gc()没有帮助

1 个答案:

答案 0 :(得分:5)

我已经研究过这个问题了一段时间,并希望分享我发现的内容:

  1. 文件描述符在Android中至少用于:

    • 网络套接字(或其他类型的文件)
    • 映射到内存文件
    • 线程 - 所以这是我的情况。见下文原因
  2. 如果您已经创建了HandlerThread,即使HandlerThread实例的最后一个链接将消失,线程仍然可以使用并使用FileDescriptor

  3. 可以看到android中的线程:

    • 在Memory Abalyze Tool中的“Java堆转储”中 - 所以我看到了>运行intsrumentation测试时有500个线程 - 它们“吃掉”所有文件描述符
    • 通过Android设备上的终端adb shell ps -t或仅ps -t