java - jstack - 不包含线程堆栈跟踪

标签 java jvm jstack

使用 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 向我显示了以下堆栈跟踪:

native-stack

就我而言,这是一个运行线程结束后 Hook 的 JDWP 代理。请注意,标准 Java 调试代理 (libjdwp) 是 JVM TI 代理的特例,它具有重要的 ThreadEnd 处理程序。

这是一个错误 JDK-8227269这导致线程终止缓慢。因此,如果您在打开调试代理时遇到问题,第一个建议是在没有 JDWP 的情况下运行 JVM。

关于java - jstack - 不包含线程堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62908606/

相关文章:

java - 'expensive'是如何在运行的JVM上执行jstack的?

java - 尝试增加 jvm 内存时,您可以将 Xmx 设置为最大数量吗?

java - 从另一个 JVM 加载 JVM 中现有的类对象

java - 如何理解频繁垃圾回收的原因?

java - top -H 显示了几个没有出现在 jstack 输出中的线程 ID

java - 为什么当/tmp/.java_pid<num>套接字文件被删除时jstack不工作

java - java子类中的共享变量

java - 是否可以并行编译大型 Java 模块?

java - BroadcastReceiver onRecive 无法正常工作

java - 什么时候绝对需要泛型数组——一个案例