Java Android文件描述符泄漏调试
我们公司有很多在虚拟/真实设备上运行的ui测试。在运行一段时间后,测试随机崩溃,我认为这是文件描述符超过的结果:我使用了Java Android文件描述符泄漏调试,java,android,linux-kernel,file-descriptor,Java,Android,Linux Kernel,File Descriptor,我们公司有很多在虚拟/真实设备上运行的ui测试。在运行一段时间后,测试随机崩溃,我认为这是文件描述符超过的结果:我使用了 ls/proc/${PID}/fd|wc-l和lsof-p${PID} 但这并没有多大帮助-lsof中的大多数行看起来像: 30015 u0_a104 678 sock 859560 socket:[859560] 30015 u0_a104 679 0000
ls/proc/${PID}/fd|wc-l
和lsof-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/UTIL可以找到泄漏源
p.S.System.gc()没有任何帮助我已经为这个问题研究了一段时间,希望与大家分享我的发现:
- 网络套接字(或其他类型的文件)
- 映射到内存文件
- 线程-所以这是我的情况。见下文为什么
- 在“Java堆转储”内存分析工具中——我已经看到运行IntsRunning测试时超过500个线程——它们“吃掉”了所有文件描述符
- 通过android设备上的终端
或仅仅adb外壳ps-t
ps-t
您正在泄漏文件、套接字或选择器。是的,但是Java中的哪些类使用它们?如何找到它们?另一种查看线程的方法是通过Android Studio的CPU分析器。