使用 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
除了可运行状态之外,我无法从中获取任何信息。请指导我调试问题。
最佳答案
Java 线程没有 Java 堆栈跟踪,当
- 线程即将启动,正在运行预启动初始化或 JVM TI
ThreadStart
处理程序。 - 线程即将终止,并且正在运行退出后清理或 JVM TI
ThreadEnd
处理程序。 - 该线程是 JVM TI agent thread ,它正在运行 native 代码。
要了解这些线程正在做什么,仅获取 Java 堆栈跟踪是不够的 - 您还需要获取 native 堆栈跟踪。
在 JDK 8 上运行
jstack -m <pid>
在 JDK 11 及更高版本上
jhsdb jstack --mixed --pid <pid>
另一种选择是使用了解 native 堆栈的分析器,例如async-profiler
在线程模式 (-t
) 下使用时,async-profiler 可以显示 JVM 中所有线程的混合堆栈跟踪,即使它们没有 Java 堆栈跟踪。
例如,当我调试类似的问题时,async-profiler 向我显示了以下堆栈跟踪:
就我而言,这是一个运行线程结束后 Hook 的 JDWP 代理。请注意,标准 Java 调试代理 (libjdwp) 是 JVM TI 代理的特例,它具有重要的 ThreadEnd
处理程序。
这是一个错误 JDK-8227269这导致线程终止缓慢。因此,如果您在打开调试代理时遇到问题,第一个建议是在没有 JDWP 的情况下运行 JVM。
关于java - jstack - 不包含线程堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62908606/