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

Java jstack-不包含线程堆栈跟踪,java,jvm,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=0x000000001d4

在使用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状态,我无法从中获得任何信息。请指导我调试该问题。

您可以尝试“-l”和“-e”选项,它可以提供更多信息,另一方面,您也可以通过java代码获取信息

jstack -l -e 18632

Thread.currentThread().getStackTrace()

Java线程没有Java堆栈跟踪,当

  • 线程即将启动,正在运行预启动初始化或JVM TI处理程序
  • 线程即将终止,正在运行退出后清理或JVM TI处理程序
  • 该线程是一个JVMTI,它运行本机代码
要了解这些线程在做什么,仅获取Java堆栈跟踪是不够的——您还需要获取本机堆栈跟踪

在jdk8上运行

jstack -m <pid>
jstack-m
在JDK11及更高版本上

jhsdb jstack --mixed --pid <pid>
jhsdb jstack——混合——pid
另一种选择是使用能够识别本机堆栈的探查器,例如

在线程模式(
-t
)中使用时,异步探查器可以显示JVM中所有线程的混合堆栈跟踪,即使它们没有Java堆栈跟踪

"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

例如,当我调试类似问题时,async profiler向我显示了以下堆栈跟踪:

在我的例子中,这是一个运行post-thread-end-hook的JDWP代理。请注意,标准Java调试代理(libjdwp)是JVM TI代理的一种特殊情况,它具有非平凡的
ThreadEnd
处理程序


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

非常感谢您的回答。当我尝试jstack-m时,会出现以下错误。异常:sun.jvm.hotspot.debugger.DebuggerException:Windbg错误:GetThreadIdBySystemId失败!位于sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.getThreadIdFromSy sId0(本机方法)位于sun.jvm.hotspot.debugger.WindbgDebuggerLocal.getThreadIdFromSy sId(WindbgDebuggerLocal.java:284)位于sun.jvm.hotspot.debugger.windbg.amd64.WindBgamD64.getThreadID(W indbgAMD64Thread.java:88)有什么想法吗?@manovenkatesh啊,你在Windows上。VisualStudio调试器可以获取堆栈跟踪。但是,您是否使用jdwp或其他
-agentpath
选项运行JVM?非常感谢@apangin是的,我在Windows中,我将使用visual studio调试器进行检查。我正在使用JDWP选项来运行JVM。我添加了它(在您最初提醒我没有添加它之后,所以我得到了上面给定的错误),现在我得到了一些本机跟踪,但我也得到了一些错误。sun.jvm.hotspot.debugger.DebuggerException:Windbg错误:ReadVirtual失败!-我不确定这个错误。抱歉,询问了太多与异常相关的查询。但我在网上搜索时没有得到任何有用的东西。再次感谢你的帮助!!