/ 目录 / 演练场 / tda
● 社区 irockel ⚡ 即开即用

tda

作者 irockel · irockel/tda

让 Claude 能读懂 Java 线程转储——检测死锁、长时间运行的线程、虚拟线程固定、本地方法阻塞。

TDA (Thread Dump Analyzer) 提供图形界面和 MCP 模式。在无头 JAR 模式下,它暴露 6+ 个工具用于解析转储日志、总结状态、检测死锁、定位长时间运行的线程,以及分析虚拟线程载体固定。

为什么要用

核心特性

实时演示

实际使用效果

tda.replay ▶ 就绪
0/0

安装

选择你的客户端

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "tda": {
      "command": "TODO",
      "args": [
        "See README: https://github.com/irockel/tda"
      ],
      "_inferred": true
    }
  }
}

打开 Claude Desktop → Settings → Developer → Edit Config。保存后重启应用。

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "tda": {
      "command": "TODO",
      "args": [
        "See README: https://github.com/irockel/tda"
      ],
      "_inferred": true
    }
  }
}

Cursor 使用与 Claude Desktop 相同的 mcpServers 格式。项目级配置优先于全局。

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "tda": {
      "command": "TODO",
      "args": [
        "See README: https://github.com/irockel/tda"
      ],
      "_inferred": true
    }
  }
}

点击 Cline 侧栏中的 MCP Servers 图标,然后选 "Edit Configuration"。

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "tda": {
      "command": "TODO",
      "args": [
        "See README: https://github.com/irockel/tda"
      ],
      "_inferred": true
    }
  }
}

格式与 Claude Desktop 相同。重启 Windsurf 生效。

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "tda",
      "command": "TODO",
      "args": [
        "See README: https://github.com/irockel/tda"
      ]
    }
  ]
}

Continue 使用服务器对象数组,而非映射。

~/.config/zed/settings.json
{
  "context_servers": {
    "tda": {
      "command": {
        "path": "TODO",
        "args": [
          "See README: https://github.com/irockel/tda"
        ]
      }
    }
  }
}

加入 context_servers。Zed 保存后热重载。

claude mcp add tda -- TODO 'See README: https://github.com/irockel/tda'

一行命令搞定。用 claude mcp list 验证,claude mcp remove 卸载。

使用场景

实战用法: tda

使用 TDA 从线程转储诊断 JVM 卡顿

👤 Java 后端工程师 ⏱ ~20 min advanced

何时使用: 生产 JVM 无响应;你有一系列 kill -3 转储。

前置条件
  • 已下载 tda.jar — github.com/irockel/tda releases
  • 已安装 Java 21+ — 用于 Project Loom 分析功能
步骤
  1. 解析日志
    对 /tmp/threaddumps.log 运行 parse_log。汇总:有多少个转储,每个转储有多少线程。✓ 已复制
    → 转储概览
  2. 检查死锁
    在所有转储中运行 check_deadlocks。哪些线程,哪些锁?✓ 已复制
    → 死锁循环(如果有)
  3. 查找长时间运行的线程
    查找在所有转储中持续的 find_long_running 线程。它们在做什么?✓ 已复制
    → 包含堆栈头的列表

结果: 导致卡顿的特定线程 + 锁 + 代码路径。

注意事项
  • 打印到 stdout 的脚本会破坏 JSON-RPC 流 — 使用 java -Djava.awt.headless=true -jar tda.jar --mcp,不要将其包装在任何也输出内容的脚本中

在 Loom 应用中追踪虚拟线程载体固定

👤 采用 Project Loom 的团队 ⏱ ~30 min advanced

何时使用: 虚拟线程未能提供你预期的并发——怀疑存在固定。

步骤
  1. 在负载期间捕获转储
    在峰值负载时收集线程转储;在 TDA 中对它们运行 parse_log。✓ 已复制
    → 转储已加载
  2. 分析
    运行 analyze_virtual_threads。显示载体固定热点和固定它们的 Java 代码(通常是同步块或本地方法)。✓ 已复制
    → 包含源代码提示的固定列表

结果: 有证据支持的针对性修复(使用 ReentrantLock 替代 synchronized,等等)。

识别卡在本地方法中的线程

👤 JNI 密集型应用的性能工程师 ⏱ ~15 min advanced

何时使用: 你的应用与本地库集成,且你怀疑存在阻塞的本地调用。

步骤
  1. 列出本地阻塞的线程
    对转储 #3 运行 get_native_threads。它们卡在哪些本地方法中?✓ 已复制
    → 线程 + 本地帧列表

结果: 对特定 JNI 调用点的针对性审查。

组合

与其他 MCP 搭配,撬动十倍杠杆

将线程级别的发现与 JVM 指标关联

TDA 说锁 X 被争用——显示来自 Prometheus 的同一时间窗口的 JVM thread_blocked_seconds。✓ 已复制
tda + github

将发现转换为带有代码指针的问题

对于前 3 个 TDA 发现,打开 GitHub issue 链接可疑的 Java 源代码行。✓ 已复制

工具

此 MCP 暴露的能力

工具输入参数何时调用成本
parse_log path: str 第一步,总是 local CPU
get_summary 深入前的概览 0
check_deadlocks 卡顿诊断 0
find_long_running min_dumps?: int 持久线程 0
analyze_virtual_threads Loom 诊断 0
get_native_threads dump_index?: int JNI 怀疑 0
get_zombie_threads 未解决的内存重定位 0
clear 解析新日志前重置 0

成本与限制

运行它的成本

API 配额
每次调用 Token 数
线程转储很大——完整转储每个 20k+ token。转储到聊天前先汇总
费用
免费
提示
在询问完整堆栈前,使用 get_summary/find_long_running 进行筛选

安全

权限、密钥、影响范围

凭据存储:
数据出站: 无——完全本地文件解析

故障排查

常见错误与修复

MCP 握手损坏

完全按照 README 运行 JAR(无头 + --mcp,没有将内容输出到 stdout 的包装脚本)

parse_log 在自定义转储格式上失败

确保转储是标准 HotSpot 格式;某些 APM 添加了 TDA 无法解析的前缀

大日志导致内存溢出

为 tda.jar 增加 JVM 堆:-Xmx4g 或将日志拆分为块

替代方案

tda 对比其他方案

替代方案何时用它替代权衡
FastThread / 其他在线分析器你可以接受将转储上传到第三方数据离开你的网络
async-profiler + 火焰图你有实时控制权并且想要采样分析器而不是转储不同的制品;需要代理附加

更多

资源

📖 阅读 GitHub 上的官方 README

🐙 查看未解决的 issue

🔍 浏览全部 400+ MCP 服务器和 Skills