23


我有一个 Java 进程/应用程序。当我在该 java 进程上运行 /usr/sbin/lsof -p 时,我看到很多“无法识别协议”。此外,有趣的是,文件描述符 (FD) 正在以非常稳定的速度增长。并且正在创建的那些 FD 的描述为“无法识别协议”。

那么,有什么方法可以检测/分析 java 进程,以便确定谁在创建这么多 FD。对任何工具的任何详细解释都会非常有帮助。

一个快速的谷歌搜索告诉我 strace 是一种方法,但 IIUC 将显示来自 java 进程的 linux 系统调用。我对我的 java 代码的哪一部分表现不佳比生成的系统调用更感兴趣。

同样,任何想法/建议都会很棒!

4

3 回答 3

16

Lsof 打印can't identify protocol半开 TCP/IP 连接:https ://idea.popcount.org/2012-12-09-lsof-cant-identify-protocol/

于 2012-12-09T17:35:14.903 回答
8

当 lsof 打印“无法识别协议”时,这通常与套接字有关(在相关输出行中也应该说“sock”)。

因此,在您的代码中的某个地方,您可能正在连接套接字并且没有正确关闭它们(也许您需要一个 finally 块)。

我建议您在并行运行 lsof 时使用调试器(最容易使用您的 IDE,如果需要,可能使用远程调试器)逐步执行您的代码。您最终应该能够看到创建这些文件描述符的线程/代码行。

有关Lsof 输出的更多详细信息,请参阅此 FAQ的第 10.2.2 点。

于 2011-10-27T06:14:31.333 回答
1

当您使用 SSL 和主机名时,您可能会发现 JVM 1.6 中存在连接泄漏的错误:http ://bugs.sun.com/view_bug.do?bug_id=6745052

于 2012-04-04T05:51:52.483 回答