来自Linux-Java线程转储的套接字信息

时间:2016-01-07 13:30:18

标签: java linux sockets thread-dump

在分析性能问题时,我每5秒进行一次连续线程转储,并使用武士线程转储分析器进行分析。注意到,许多线程都处于可运行状态,并且在所有出现的情况下连续发生堆栈转储。但我无法找到他们正在沟通的主持人。我尝试使用命令HashMap<String,Integer>ss -t -awatch ss -tp,但无法将结果与线程相关联。任何的想法?提前谢谢。

netstat -A inet -p

2 个答案:

答案 0 :(得分:2)

nid实际上是底层操作系统的进程/线程ID(至少对于Linux),尽管是十六进制表示法。转换为十进制pid并使用

lsof -p pid |grep -Ei 'tcp|socket'

了解有关所使用的套接字连接的更多信息。但事实证明,所有套接字都是由主线程打开的,在这种情况下,子线程只会继承几个(很多),所以可能很难看到它连接到哪个线程。

如果lsof没有显示主流程的主题(似乎确实没有),您可能必须决定调查/proc/<pid>/fd

答案 1 :(得分:1)

tid是Java级别的线程ID,nid是本机线程ID。 nid在不同的操作系统上实际指的是somewhat confusing。我建议使用Visual VM等工具连接到您的应用程序,并记下应用程序的PID。获得PID后,请尝试以下命令:

sudo netstat -nlpt

这应该给你类似下面的东西(带有远程/本地地址和PID和程序名称):

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      1144/dnsmasq    
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      661/cupsd       
tcp6       0      0 ::1:631                 :::*                    LISTEN      661/cupsd

这应该告诉你哪些连接是从你的Java程序打开的。