如果是所有的线程
那对于正常的线程来说
那那些 at 代表啥?
如果是出问题的线程
有的线程状态是 running,有啥问题?
1
kaneg 2017-11-15 20:28:32 +08:00 via iPhone
所有的。
at 是每个线程当前正在执行方法的堆栈信息 |
4
esolve OP @kaneg 那如何定位问题啊
譬如一个 http 线程耗时很长甚至不成功, 要排查原因 那怎么找到问题? 假设线程有好几个数据库查询语句, 有一个语句耗时很长甚至不成功 我想找到这个语句 你的意思 jstack 是快照, 那么我用 jstack 的时候,这个线程恰好运行到没啥问题的其他几个数据库查询 而不是我要找的那个数据库查询 这样怎么找问题所在? |
5
kaneg 2017-11-16 11:28:18 +08:00
@esolve
这种动态的情况用快照这种方法就不一定管用了。一般来说就是打 log,在可能执行到的地方都打上 log,与耗时相关的打上时间,然后在 log 中定位你认为有问题的行,这样逐渐缩小范围,定位到可能出问题的代码行,然后再用 Remote Debug,打好合适的断点,逐行排除,直至找到问题原因。 |
6
esolve OP @kaneg 有点奇怪,只能快照的话,感觉 jstack 根本找不出问题啊,除非是线程长时间的阻塞。
BTW: 我看到的一个问题是: java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) at java.net.SocketInputStream.read(SocketInputStream.java:170) at java.net.SocketInputStream.read(SocketInputStream.java:141) at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:100) at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:143) at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:173) - locked <0x000000056ce28410> (a com.mysql.jdbc.util.ReadAheadInputStream) at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2911) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3337) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3327) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530) - locked <0x000000056ca3a818> (a com.mysql.jdbc.JDBC4Connection) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907) - locked <0x000000056ca3a818> (a com.mysql.jdbc.JDBC4Connection) at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2030) - locked <0x000000056ca3a818> (a com.mysql.jdbc.JDBC4Connection) 这里有几个 locked 这是啥意思? 过程中阻塞了四次?每次一定秒数? |
7
kaneg 2017-11-16 15:15:15 +08:00
@esolve
这里的 locked 是同步锁,在 java 的多线程代码中很常见,没有什么不正常的。 从下面的行可以看出 java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) 你的代码在进行持续的 Read 操作,而从下面的 Sql connection 可以推断出,当前线程在执行完一个 sql 后在往回读 Result。 如果这个时间很长,一般有两种原因: 1. 网络速度慢 2. sql 执行后的结果数据量很大 |