0

0

Java怎么查看线程堆栈 Java jstack命令使用教程【技巧】

月夜之吻

月夜之吻

发布时间:2026-02-01 04:59:11

|

737人浏览过

|

来源于php中文网

原创

jstack用于查看Java进程线程堆栈,基本命令为jstack ,支持-l(显示锁详情)、-e(导出本地帧)、-F(强制dump)等参数;需注意容器环境权限与挂载限制,虚拟线程需显式启用参数才可见。

java怎么查看线程堆栈 java jstack命令使用教程【技巧】

怎么用 jstack 查看 Java 进程的线程堆

jstack 是 JDK 自带的诊断工具,直接输出目标 JVM 进程中所有线程的当前调用栈。它不依赖应用是否响应,只要进程还在运行(哪怕卡死),就能抓到快照。

基本用法:jstack ,其中 是 Java 进程的进程 ID,可通过 jps -lps aux | grep java 获取。

  • -l 参数可显示锁详细信息(比如 java.util.concurrent.locks.ReentrantLock$NonfairSync 的持有/等待状态)
  • -e(JDK 8u60+)可导出额外的本地帧(native frames),对排查 JNI 或 GC 线程阻塞有帮助
  • 若进程无响应但 jstackUnable to get pid of LinuxThreads manager thread,通常是容器环境或使用了 -XX:+UseContainerSupport 但未正确配置 cgroup,此时尝试加 -F 强制 dump(需 root 权限)

jstack 输出里怎么看线程状态和锁竞争

输出按线程分块,每块以 "Thread-0" #12 prio=5 os_prio=0 tid=0x00007f8b4c0a2000 nid=0x3a5b waiting on condition [0x00007f8b3d9f9000] 开头,关键字段含义:

  • tid:JVM 内部线程 ID(十六进制),可用于 jcmd VM.native_memory summary 关联本地内存
  • nid操作系统级线程 ID(十六进制),可用 top -H -p 查 CPU 占用
  • waiting on condition / parking to wait for / in Object.wait():说明线程在等某个条件,未必是死锁,但需结合后续栈帧看等谁
  • java.lang.Thread.State: BLOCKED (on object monitor) + waiting to lock :明确表示该线程被阻塞在 synchronized 块外,正等待获取指定对象监视器

注意:jstack 不会自动标出死锁,得靠人眼扫描多个线程是否循环等待同一组锁;也可用 jstack -l | grep -A 10 "Found one Java-level deadlock" 快速定位(仅当 JVM 检测到时才输出)。

立即学习Java免费学习笔记(深入)”;

TemPolor
TemPolor

AI音乐生成器,一键创作免版税音乐

下载

容器环境下 jstack 失效的常见原因和绕过方法

在 Docker/Kubernetes 中直接执行 jstack 容易失败,典型现象包括:Can't attach to processNo such process、或只看到 Signal Dispatcher 等少量线程。

  • 根本原因是:JDK attach mechanism 依赖 /proc//root/tmp 可写,而容器常限制 procfs 挂载或禁用 ptrace
  • 解决路径一:启动容器时加 --cap-add=SYS_PTRACE 并挂载宿主机 /proc-v /proc:/proc:ro
  • 解决路径二:进入容器后,用 kill -3 触发 java 进程自己打印堆栈到 stdout/stderr(前提:JVM 启动参数含 -XX:+PrintGCDetails 不影响,但必须没重定向掉日志)
  • 解决路径三:用 jcmd Thread.print 替代(兼容性更好,部分受限容器仍可工作)

为什么有时候 jstack 看不到你关心的线程

不是所有线程都会出现在 jstack 输出里。以下情况会导致“丢失”:

  • 线程已退出但栈帧还残留在 native memory(如 Thread.run() 执行完,但 JVM 尚未回收线程对象)——此时不会显示
  • 使用 VirtualThread(Project Loom)且未开启 -Djdk.virtualThreadDump=true,则 jstack 默认不展示虚拟线程(JDK 21+)
  • 某些 native 线程(如 G1 Conc Refine Thread、ZStatSampler)属于 JVM 内部调度线程,jstack 不捕获其 Java 栈,只显示 Native frames(若有)
  • 如果应用用了 Unsafe.park() 或自定义线程池且线程处于 WAITING 状态但未关联 monitor,jstack 只能显示 parking to wait for,无法指出具体等待哪个 AbstractQueuedSynchronizer 实例

真正难的从来不是执行 jstack,而是从几百行输出里快速定位哪几行栈帧对应业务慢点、哪几个 tid 在争同一个 0x... 锁地址——这需要反复比对、结合代码上下文,没法靠工具自动完成。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.09.27

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

399

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

399

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

546

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

87

2025.12.01

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

258

2023.07.24

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.3万人学习

Git 教程
Git 教程

共21课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号