java命令-jstack
jstack用于生产java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法
堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,比如线程间死锁、死循环、请求
外部资源导致长时间等待等。线程出现停顿的时候通过jstack命令可查看各个线程的调用堆栈
线程状态
new 未启动
runnable 在虚拟机内执行
blocked 阻塞并等待监视器锁
waiting 无限等待另一个线程执行特定操作
timed_waiting 有时限地等待另一个线程的特定操作
terminated 已退出
jstack使用简单示例(死锁情况模拟)
1 public class DeadLock { 2 3 public static void main(String[] args) { 4 //获取当前线程pid 5 System.out.println(ManagementFactory.getRuntimeMXBean().getName()); 6 Thread t1 = new Thread(new DeadLockClass(true)); 7 Thread t2 = new Thread(new DeadLockClass(false)); 8 t1.start(); 9 t2.start(); 10 } 11 } 12 13 14 class DeadLockClass implements Runnable { 15 public boolean flag; 16 17 public DeadLockClass(boolean flag) { 18 this.flag = flag; 19 } 20 21 @Override 22 public void run() { 23 if(flag) { 24 while(true) { 25 synchronized (SuoObject.obj_1) { 26 System.out.println("obj_1" + Thread.currentThread().getName()); 27 synchronized (SuoObject.obj_2) { 28 System.out.println("obj_2" + Thread.currentThread().getName()); 29 } 30 } 31 } 32 }else { 33 while(true) { 34 synchronized (SuoObject.obj_2) { 35 System.out.println("obj_2" + Thread.currentThread().getName()); 36 synchronized (SuoObject.obj_1) { 37 System.out.println("obj_1" + Thread.currentThread().getName()); 38 } 39 } 40 } 41 } 42 } 43 } 44 45 class SuoObject { 46 static Object obj_1 = new Object(); 47 static Object obj_2 = new Object(); 48 }
根据打印出的线程pid, 使用jstack pid命令,即可出现如下如所示结果,死锁的信息一目了然!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?