【问题标题】:Android file descriptor leakage debugingAndroid 文件描述符泄漏调试
【发布时间】:2016-03-30 09:25:51
【问题描述】:

我们公司有很多在虚拟/真实设备上运行的 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 工具/工具可以找到泄漏的来源

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

【问题讨论】:

  • 您正在泄漏文件或套接字或选择器。
  • 是的,但是 Java 中的哪些类使用它们?如何找到它们?

标签: java android linux-kernel file-descriptor


【解决方案1】:

我为这个问题研究了一段时间,想分享一下我的发现:

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

    • 网络套接字(或其他类型的文件)
    • 映射到内存文件
    • 线程 - 所以这是我的情况。请参阅下面的原因
  2. 如果你已经创建了一个HandlerThread,即使最后一个指向HandlerThread实例的链接会消失,线程仍然会工作并消耗FileDescriptor

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

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

【讨论】:

  • 查看线程的另一种方法是通过 Android Studio 的 CPU 分析器。
猜你喜欢
  • 2014-09-20
  • 2023-04-09
  • 2015-09-23
  • 1970-01-01
  • 2011-01-15
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多