首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jstack -不包含线程堆栈跟踪

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

Stack Overflow用户
提问于 2020-07-15 14:10:56
回答 2查看 547关注 0票数 2

同时使用jstack来了解特定进程的线程。对于许多线程,我找不到任何堆栈跟踪。

代码语言:javascript
复制
"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状态之外,我无法从中获得任何信息。请指导我调试这个问题。

EN

回答 2

Stack Overflow用户

发布于 2020-07-15 17:32:57

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

  • 线程即将启动,并且正在运行预启动初始化或JVM TI ThreadStart处理程序。
  • 线程即将终止,并且正在运行退出后清理或JVM TI ThreadEnd处理程序。
  • 线程是正在运行本机代码的JVM TI agent thread

要找出这些线程在做什么,仅获得Java堆栈跟踪是不够的-您还需要获得本机堆栈跟踪。

在JDK 8上运行

代码语言:javascript
复制
jstack -m <pid>

在JDK 11和更高版本上

代码语言:javascript
复制
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。

票数 2
EN

Stack Overflow用户

发布于 2020-07-15 17:13:04

你可以尝试"-l“和"-e”选项,它可以提供更多的信息,也可以通过java代码获取信息。

代码语言:javascript
复制
jstack -l -e 18632

Thread.currentThread().getStackTrace()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62908606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档