我有一个Java进程/应用程序。当我在那个java进程上运行/ usr / sbin / lsof -p时,我看到很多“无法识别协议”。另外,有趣的是,文件描述符(FD)以非常稳定的速率增加。正在创建的那些FD的描述为“无法识别协议”。
那么,有没有办法对java进程进行检测/分析,以便确定谁在创建那么多FD。对任何工具的任何详细解释都非常有用。
一个快速的谷歌搜索告诉我strace是一种方式,但IIUC,将显示来自java进程的Linux系统调用。我更感兴趣的是我的java代码中哪一部分的行为比生成系统调用的行为要差。同样,任何想法/建议都会很棒!
答案 0 :(得分:14)
Lsof为半开TCP / IP连接打印can't identify protocol
:https://idea.popcount.org/2012-12-09-lsof-cant-identify-protocol/
答案 1 :(得分:8)
当lsof打印“无法识别协议”时,这通常与套接字有关(它也应该在相关的输出行中说'sock')。
因此,在您的代码中的某个地方,您可能正在连接套接字并且没有正确关闭它们(可能您需要一个finally块)。
我建议您使用调试器(最容易使用IDE,可能需要远程调试器,如果需要)逐步执行代码,同时并行运行lsof。您最终应该能够看到哪个线程/代码行正在创建这些文件描述符。
有关Lsof输出的更多详细信息,请参阅this FAQ的第10.2.2节。
答案 2 :(得分:1)
当您使用SSL和主机名时,可能会在JVM 1.6中发现连接泄漏的错误:http://bugs.sun.com/view_bug.do?bug_id=6745052