如何通过命令行获取特定时间区间的thread dump?
命令行获取指定时间范围Thread Dump的操作方法
注意:JVM默认不会持久化存储历史线程转储(Thread Dump),如果你没有提前配置定时采集任务,无法直接回溯获取10/30分钟之前的转储数据。以下方案分为两种场景:提前配置过采集任务时提取对应时间段的转储、从当前开始采集后续指定时长的转储。
第一步:查询目标Java进程PID
执行以下任意一个命令找到你需要采集的Java进程ID,后续用<pid>指代该ID:
jps -l(仅列出Java进程,推荐)ps -ef | grep java
第二步:定时采集Thread Dump(如需采集未来的指定时长数据)
如果你需要从当前开始采集未来10/30分钟的转储,可以用循环定时执行采集命令,文件名自动加时间戳方便后续筛选:
方案A:使用jstack采集(兼容所有JDK版本)
# 采集未来30分钟的转储,每10秒采集一次,存储到指定目录 for i in {1..180}; do jstack -l <pid> > /opt/thread_dumps/threaddump_$(date +%Y%m%d_%H%M%S).txt; sleep 10; done
- 要采集10分钟的话,把循环次数
180改成60即可 - 采集间隔可以自定义调整,修改
sleep后面的秒数就行
方案B:使用jcmd采集(JDK 1.7及以上版本推荐,兼容性更好)
把上面循环里的采集命令替换为jcmd即可:
jcmd <pid> Thread.print -l > /opt/thread_dumps/threaddump_$(date +%Y%m%d_%H%M%S).txt
第三步:筛选最近10/30分钟的转储文件
如果已经开启了定时采集,要提取指定时间范围内的转储,直接用find命令筛选即可:
- 提取最近30分钟的转储:
find /opt/thread_dumps -name "threaddump_*.txt" -mmin -30 - 提取最近10分钟的转储:
find /opt/thread_dumps -name "threaddump_*.txt" -mmin -10
注意事项
- 线程转储采集对JVM性能影响极低,生产环境可以放心执行
- 如果目标Java进程使用root权限启动,采集命令前需要加
sudo否则会报权限错误 - 不推荐使用
kill -3 <pid>命令采集,该方式会把转储内容输出到JVM的标准输出日志中,后续筛选历史转储的难度很高
内容的提问来源于stack exchange,提问作者SKempegowda
相关产品推荐
相关产品推荐

