跳到主要内容

自定义线程池问题排查

arthas

找目标线程池

# 使用 tt 命令跟踪线程池的方法调用(如 execute 方法),获取实例引用:

# 跟踪线程池的 execute 方法调用,最多记录 10 次(会打印 INDEX 等字段的数据)
tt -t org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor execute -n 10

# 替换 INDEX 为捕获的记录索引(如 1006、1009,这些是 ThreadPoolTaskExecutor 实例)
tt -i 1006 -x 2
# 能看到bean名称(看不到线程池配置和线程池名称前缀)

# 查看实例的线程池配置(替换 INDEX 为目标索引)(也能看到threadNamePrefix线程池名称前缀)
tt -i 1012 -w 'target'
# 只看线程池名称(示例: member-common-sync-thread-pool-)
tt -i 1012 -w 'target.threadNamePrefix'

下一步, 找目标线程

# 查找包含目标前缀的线程(会打印 ID 等信息)
thread --all | grep "member-common-sync-thread-pool-"
# 查看该线程的具体执行内容, 替换 131 为实际线程 ID
thread 131
# 堆栈会显示线程正在执行的方法(如数据库操作、业务逻辑等),帮助定位是否有耗时操作。

监控线程的动态执行情况

如果需要持续跟踪线程的状态变化,可使用 thread -b 命令监控阻塞线程,或结合 watch 命令监控线程执行的方法 当线程执行该方法时,会自动输出参数、返回值和执行时间,便于分析是否存在超时或异常。