PS:指令中的14222为进程ID
1、使用 jps 获取进程id
# 显示完整类名
jps -l
# 输出:
# 14222 /path/to/ReduceContextSwitchDemo.jar
# 14223 sun.tools.jps.Jps
# 显示 JVM 参数
jps -v
# 显示传递给 main 的参数
jps -m
2、导出并查看线程堆栈
# 导出到文件
jstack 14222 > dump_high_concurrency.txt
# 或者直接查看
jstack 14222 | less
# Linux/Mac
cat dump_high_concurrency.txt
3、统计线程状态
统计各状态线程数量
# 方式1:使用 grep + sort + uniq
jstack 14222 | grep "java.lang.Thread.State" | sort | uniq -c
# 方式2:使用 awk(更简洁)
jstack 14222 | grep "Thread.State:" | cut -d: -f2 | sort | uniq -c
# 方式3:从文件统计
grep "Thread.State:" dump_high_concurrency.txt | cut -d: -f2 | sort | uniq -c
查找 WAITING 线程详情
# 查看所有 WAITING 线程
grep -A 5 "WAITING (on object monitor)" dump_high_concurrency.txt | head -30
# 统计 WAITING 线程在等待什么
grep -A 3 "WAITING (on object monitor)" dump_high_concurrency.txt | grep "at " | sort | uniq -c
4、观察系统性能指标
监控上下文切换
# 实时监控(每秒刷新)
vmstat 1
# 输出示例:
# procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
# r b swpd free buff cache si so bi bo in cs us sy id wa st
# 2 0 0 1234567 12345 123456 0 0 0 0 123 5678 1 1 98 0 0
# ↑ ↑
# in cs
# in = interrupts (中断次数)
# cs = context switches (上下文切换次数)
监控 CPU 使用率
# 查看 CPU 使用情况
top -H -p 14222
# 或使用 htop(更直观)
htop -p 14222
监控线程数
# 查看进程的线程数
ps -eLf | grep 14222 | wc -l
# 或使用 top
top -H -p 14222
# 按 'H' 键切换线程视图
优化方案
1、合理创建线程池
2、减少锁竞争,减少锁的粒度
3、避免不必要的竞争
4、使用异步编程