同时使用jstack来了解特定进程的线程。对于许多线程,我找不到任何堆栈跟踪。
"Thread-4978" #5139 prio=5 os_prio=0 tid=0x000000001d451800 nid=0x8530 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Thread-4808" #4969 prio=5 os_prio=0 tid=0x000000001d44f000 nid=0x8eb0 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE除了runnable状态之外,我无法从中获得任何信息。请指导我调试这个问题。
发布于 2020-07-15 17:32:57
Java线程没有Java堆栈跟踪,当
ThreadStart处理程序。ThreadEnd处理程序。要找出这些线程在做什么,仅获得Java堆栈跟踪是不够的-您还需要获得本机堆栈跟踪。
在JDK 8上运行
jstack -m <pid>在JDK 11和更高版本上
jhsdb jstack --mixed --pid <pid>另一种选择是使用能够识别本机堆栈的分析器,例如async-profiler
在线程模式(-t)下使用时,async-profiler可以显示JVM中所有线程的混合堆栈跟踪,即使它们没有Java堆栈跟踪。
例如,当我调试一个类似的问题时,async-profiler向我显示了以下堆栈跟踪:

在我的例子中,这是一个运行后线程结束钩子的JDWP代理。注意,标准Java debug agent (libjdwp)是JVM代理的一种特殊情况,它具有非常重要的ThreadEnd处理程序。
这是一个导致线程缓慢终止的错误JDK-8227269。因此,如果在打开调试代理的情况下遇到问题,第一个建议是在不使用JDWP的情况下运行JVM。
发布于 2020-07-15 17:13:04
你可以尝试"-l“和"-e”选项,它可以提供更多的信息,也可以通过java代码获取信息。
jstack -l -e 18632
Thread.currentThread().getStackTrace()https://stackoverflow.com/questions/62908606
复制相似问题