在分析性能问题时,我每隔5秒进行一次连续的线程转储,并使用武士线程转储分析器进行分析。请注意,许多线程都处于可运行状态,在所有情况下都会连续出现堆栈下面的转储。但我找不到他们在与哪台主机通信。我尝试使用命令ss -t -a、watch ss -tp和netstat -A inet -p,但无法将它们的结果与线程相关联。有什么想法吗?提前谢谢。
Thread dump 2/5 "TP-Processor125" prio=5 tid=0x25756 nid=0x649c RUNNABLE (JNI Native Code) - stats: cpu=828 blk=-1 wait=-1 java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:628)
at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:566)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:693)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Thread.java:745) Locked synchronizers: count = 0发布于 2016-01-07 22:33:12
nid实际上是底层操作系统的进程/线程ID (至少对于Linux),尽管采用十六进制表示法。转换为十进制pid并使用
lsof -p pid |grep -Ei 'tcp|socket'以了解有关所使用的套接字连接的更多信息。然而,结果可能是,所有套接字都是由主线程打开的,在这种情况下,子线程只继承几个(许多),因此可能很难看出它连接到了哪个线程。
如果lsof没有显示主进程的线程(看起来确实没有),那么您可能不得不检查一下/proc/<pid>/fd。
发布于 2016-01-08 00:33:45
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程序打开了哪些连接。
https://stackoverflow.com/questions/34656396
复制相似问题