/ 目錄 / 演練場 / tda
● 社群 irockel ⚡ 即開即用

tda

作者 irockel · irockel/tda

让 Claude 能读懂 Java 线程转储——检测死锁、长时间运行的线程、虚拟线程占用、原生方法阻塞。

TDA (Thread Dump Analyzer) 提供 GUI 和 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. 解析日志
    parse_log on /tmp/threaddumps.log. 汇总:多少个转储,每个转储有多少个线程。✓ 已複製
    → 转储概览
  2. 检查死锁
    check_deadlocks across all dumps. 哪些线程,哪些锁?✓ 已複製
    → 死锁循环(如有)
  3. 查找长时间运行的线程
    find_long_running threads persisting across all dumps. 它们在做什么?✓ 已複製
    → 带堆栈头的列表

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

注意事項
  • 脚本打印到标准输出会破坏 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 代码(通常是 synchronized 块或原生方法)。✓ 已複製
    → 带源提示的占用列表

結果: 基于证据的定向修复(用 ReentrantLock 替代 synchronized 等)。

识别卡在原生方法中的线程

👤 使用大量 JNI 的应用的性能工程师 ⏱ ~15 min advanced

何時使用: 你的应用与原生库集成,你怀疑原生调用被阻止。

步驟
  1. 列出被原生代码阻止的线程
    get_native_threads for dump #3. 它们卡在哪些原生方法中?✓ 已複製
    → 线程 + 原生帧列表

結果: 针对特定 JNI 调用点的定向审查。

組合

與其他 MCP 搭配,撬動十倍槓桿

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

TDA says lock X is contended — show JVM thread_blocked_seconds for the same window from Prometheus.✓ 已複製
tda + github

将发现转变为包含代码指针的问题

For the top 3 TDA findings, open a GitHub issue linking the suspect Java source lines.✓ 已複製

工具

此 MCP 暴露的能力

工具輸入參數何時呼叫成本
parse_log path: str 首步,始终 本地 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,没有打印到标准输出的包装脚本)

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

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

内存在大日志上爆炸

增加 tda.jar 的 JVM 堆:-Xmx4g 或将日志分割成块

替代方案

tda 對比其他方案

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

更多

資源

📖 閱讀 GitHub 上的官方 README

🐙 查看未解決的 issue

🔍 瀏覽全部 400+ MCP 伺服器和 Skills