You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过命令行获取特定时间区间的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:36:07