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