jstack 显示的线程是出问题的线程还是所有的线程? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
esolve

jstack 显示的线程是出问题的线程还是所有的线程?

  •  
  •   esolve 2017 年 11 月 15 日 1748 次点击
    这是一个创建于 3083 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果是所有的线程

    那对于正常的线程来说

    那那些 at 代表啥?

    如果是出问题的线程

    有的线程状态是 running,有啥问题?

    8 条回复    2017-11-16 18:31:28 +08:00
    kaneg
        1
    kaneg  
       2017 年 11 月 15 日 via iPhone
    所有的。
    at 是每个线程当前正在执行方法的堆栈信息
    esolve
        2
    esolve  
    OP
       2017 年 11 月 15 日
    @kaneg 一个线程里面的代码分支很多,at 只是其中的一条,为何只显示其中一条?是这条出问题了吗?
    kaneg
        3
    kaneg  
       2017 年 11 月 16 日 via iPhone
    @esolve 是 jstack 运行的那个时候,线程执行到的那个分支
    esolve
        4
    esolve  
    OP
       2017 年 11 月 16 日
    @kaneg 那如何定位问题啊

    譬如一个 http 线程耗时很长甚至不成功,
    要排查原因
    那怎么找到问题?


    假设线程有好几个数据库查询语句,
    有一个语句耗时很长甚至不成功
    我想找到这个语句

    你的意思 jstack 是快照,
    那么我用 jstack 的时候,这个线程恰好运行到没啥问题的其他几个数据库查询
    而不是我要找的那个数据库查询
    这样怎么找问题所在?
    kaneg
        5
    kaneg  
       2017 年 11 月 16 日
    @esolve

    这种动态的情况用快照这种方法就不一定管用了。一般来说就是打 log,在可能执行到的地方都打上 log,与耗时相关的打上时间,然后在 log 中定位你认为有问题的行,这样逐渐缩小范围,定位到可能出问题的代码行,然后再用 Remote Debug,打好合适的断点,逐行排除,直至找到问题原因。
    esolve
        6
    esolve  
    OP
       2017 年 11 月 16 日
    @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
    这是啥意思? 过程中阻塞了四次?每次一定秒数?
    kaneg
        7
    kaneg  
       2017 年 11 月 16 日
    @esolve
    这里的 locked 是同步锁,在 java 的多线程代码中很常见,没有什么不正常的。
    从下面的行可以看出
    java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)

    你的代码在进行持续的 Read 操作,而从下面的 Sql connection 可以推断出,当前线程在执行完一个 sql 后在往回读 Result。

    如果这个时间很长,一般有两种原因:

    1. 网络速度慢
    2. sql 执行后的结果数据量很大
    esolve
        8
    esolve  
    OP
       2017 年 11 月 16 日
    @kaneg 这上面这些 at 和抛异常的 at 有啥区别
    异常里的每一个 at 都是一个函数调用入口,一步一步直到抛出异常的那行
    这里的每个 at 代表啥?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1658 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 16:24 PVG 00:24 LAX 09:24 JFK 12:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86