并发问题排查工具:从JDK工具到Arthas全解析

一、JDK自带工具 1.1 jps:查看Java进程 # 列出所有Java进程 jps -l # 输出示例: # 12345 com.example.MyApplication # 67890 org.apache.catalina.startup.Bootstrap # 参数说明: # -l:显示完整类名 # -v:显示JVM参数 # -m:显示main方法参数 1.2 jstack:线程堆栈分析 # 1. 导出线程堆栈 jstack <pid> > threads.txt # 2. 检测死锁 jstack <pid> | grep -A 20 "Found one Java-level deadlock" # 3. 查看线程数 jstack <pid> | grep "java.lang.Thread.State" | wc -l # 4. 查看BLOCKED线程 jstack <pid> | grep "java.lang.Thread.State: BLOCKED" -A 5 实战案例: # 场景1:CPU 100%排查 # 1. 找到Java进程 jps -l # 2. 找到CPU占用高的线程 top -Hp <pid> # Linux # 输出:线程ID 12345占用CPU 90% # 3. 转换线程ID为16进制 printf "%x\n" 12345 # 输出:0x3039 # 4. 查找对应线程堆栈 jstack <pid> | grep -A 50 "0x3039" # 场景2:死锁排查 jstack <pid> | grep -A 50 "Found one Java-level deadlock" 1.3 jconsole:可视化监控 # 启动jconsole jconsole # 或连接远程JVM jconsole <hostname>:<port> 核心功能: ...

2025-11-20 · maneng

Java并发03:Java线程的生命周期 - 6种状态详解

引言:一次生产事故的排查 凌晨2点,生产环境告警:CPU使用率持续100%。 # 使用top命令查看,发现Java进程CPU占用异常 $ top PID USER %CPU %MEM COMMAND 12345 app 850.0 45.2 java -jar app.jar ← 8核CPU,占用850% 使用 jstack 查看线程状态: $ jstack 12345 > thread-dump.txt # 查看线程dump "http-nio-8080-exec-45" #78 daemon prio=5 os_prio=0 tid=0x00007f8c4c001000 nid=0x1a2b RUNNABLE java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) ... "DB-Pool-Worker-23" #56 daemon prio=5 os_prio=0 tid=0x00007f8c48005000 nid=0x1a1f WAITING java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) ... "Task-Executor-8" #45 daemon prio=5 os_prio=0 tid=0x00007f8c44003000 nid=0x1a0d BLOCKED java.lang.Thread.State: BLOCKED (on object monitor) at com.example.Service.process(Service.java:42) - waiting to lock <0x000000076b5d4c00> (a java.lang.Object) ... RUNNABLE、WAITING、BLOCKED… 这些状态是什么意思? ...

2025-11-20 · maneng

死锁的产生与排查:从原理到实战

一、什么是死锁? 1.1 死锁示例 public class DeadlockDemo { private static Object lock1 = new Object(); private static Object lock2 = new Object(); public static void main(String[] args) { // 线程1:先锁lock1,再锁lock2 Thread t1 = new Thread(() -> { synchronized (lock1) { System.out.println("线程1:持有lock1,等待lock2"); sleep(100); // 模拟业务逻辑 synchronized (lock2) { System.out.println("线程1:获取lock2成功"); } } }); // 线程2:先锁lock2,再锁lock1 Thread t2 = new Thread(() -> { synchronized (lock2) { System.out.println("线程2:持有lock2,等待lock1"); sleep(100); synchronized (lock1) { System.out.println("线程2:获取lock1成功"); } } }); t1.start(); t2.start(); // 输出: // 线程1:持有lock1,等待lock2 // 线程2:持有lock2,等待lock1 // ... 程序卡住,发生死锁! } private static void sleep(long millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } } } 死锁定义: 两个或多个线程互相持有对方需要的资源,导致所有线程都无法继续执行。 ...

2025-11-20 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...