TDA线程分析实战:从jstack到死锁、高CPU定位指南
简介TDAThread Dump Analyzer2.3.3是一款面向Java开发与运维人员的线程分析工具用于解析线程Dump日志快速定位死锁、锁竞争与CPU占用高等问题适合排查性能瓶颈和线上故障。压缩包体积仅1.3MB包含3个文件tda.jar为主程序tda.bat与tda.sh分别提供Windows和Linux下的启动脚本解压后按平台运行即可免去复杂安装配置。目前已有1333人浏览学习常配合jstack生成的线程快照使用。功能上支持导入线程快照并展示状态分布总览提供线程状态可视化、死锁链路自动检测、锁竞争分析、线程耗时排序、堆栈深度对比以及过滤搜索还可导出HTML报告便于团队分享与存档。对需要频繁处理并发问题的中高级Java工程师这套工具能显著提升线程问题定位效率也可作为团队内部的通用排障工具储备。1. Thread Dump Analyzer让几千行线程 dump 变成一眼能看懂的报告线上应用突然卡死CPU 飙到 300%你 ssh 上去 jstack 一把梭拿到一份几万行的线程 dump。Thread Dump AnalyzerTDA这类工具可以把这份黑匣子瞬间拆成结构化的线程分析报告自动检测死锁、按状态归类、把互相等待的线程用颜色串起来。tda-bin-2.3.3.zip 就是它的官方二进制发布包解压即用不需要装服务端也不需要改业务代码。适合所有被线程问题折磨过的 Java 后端开发、性能测试和中间件运维尤其是那些在凌晨三点盯着 BLOCKED 发呆的人。本文从安装、解析、死锁定位到高 CPU 排查全部过一遍顺带把我在真实排障里踩过的坑都抖出来。2. 线程 dump 该看什么TDA 的解析逻辑与 2.3.3 的安装启动2.1 dump 文件的三种状态RUNNABLE、BLOCKED、WAITING 到底谁才是突破口很多新手拿到 dump 文件的第一反应是全文搜索 BLOCKED仿佛只要找到这个词问题就解决了。实际上线程 dump 里最常见的三种状态各有各的坑线程状态dump 里的典型表现排障含义RUNNABLE线程正在执行栈顶往往是一个 native 方法或业务方法别急着下结论RUNNABLE 可能是在跑 CPU 密集代码也可能是在网络读写的 native 调用里挂着BLOCKED线程在等一把被别的线程持有的监视器锁经典锁竞争TDA 的红色高亮主要针对这种WAITING栈顶是park、wait、join等调用最容易漏的坑线程池饥饿、条件等待超时都藏在这里TDA 在解析 dump 时不是简单把线程按文本列表排出来而是把每个线程的栈帧、锁对象、Locked ownable synchronizers 全部结构化然后按「锁关系」重新组织。左侧是线程列表右侧是栈帧详情底部会单独列出检测到的异常模式。这种视图比 grep 好用太多——它把「谁在等谁」画成了一条链你顺着链找根因就行。从实践看真正造成服务不可用的往往不是单个 BLOCKED 线程而是一堆 WAITING 线程把线程池占满或者一个 RUNNABLE 线程在死循环里打转。所以千万别只盯某一个状态TDA 的分组视图才是正确入口。2.2 安装启动JDK 版本与 tda.jar 的启动参数tda-bin-2.3.3.zip 是标准的二进制发布包下载后解压即可不需要编译。先确认环境里有没有 Java 运行时java -version unzip tda-bin-2.3.3.zip -d ~/tools/ cd ~/tools/tda-bin-2.3.3 ls -lh解压后目录里应该有tda.jar和若干脚本文件。启动方式有两种我一般直接用java -jar简单可控。# 直接启动 java -jar tda.jar # 如果 dump 文件很大提前给足堆内存 java -Xmx2g -jar tda.jar这里说明一下参数含义-Xmx2g是给 TDA 进程分配最多 2GB 堆内存。TDA 会把整个 dump 文件加载进内存做关系分析默认堆大小在解析几十 MB 的 dump 时容易触发 Full GC界面会卡成幻灯片。如果你的 dump 文件来自堆内存很大的 JVM比如 -Xmx8g 的服务线程数可能上万建议直接给-Xmx4g。另外 TDA 是纯客户端工具不监听端口、不写日志文件启动失败基本只有两种原因Java 版本不兼容或 jar 包损坏详见第 5 章避坑内容。2.3 载入 dump 并做第一次检测主界面布局与死锁高亮深入之前先想清楚 dump 文件是怎么来的。标准做法是使用 JDK 自带的 jstack 命令# 找到 Java 进程 PID jps -l jstack -l 12345 dump_$(date %Y%m%d_%H%M%S).txtjstack -l里的-l参数会额外输出锁的持有信息Locked ownable synchronizers这对 TDA 做死锁检测非常关键。如果不加-lTDA 拿不到完整的锁关系死锁检测结果会大打折扣。注意 jstack 本身会短暂暂停目标 JVM但相比 jmap -dump 那种全量堆转储要轻得多线上抓 dump 的默认选择就是它。打开 TDA 后菜单里选择 File - Open Thread Dump选中刚才生成的 txt 文件。载入完成后主界面左侧是按线程名称和状态组织的树右侧是选中线程的完整调用栈底部是 TDA 的检测结果面板。如果存在死锁底部会直接高亮显示 Deadlock detected并把参与死锁的线程链用颜色标出来。第一次使用的人很容易忽略底部面板我建议载入 dump 后先按 CtrlA 全选左侧线程再逐个扫一遍右侧栈顶最后才看底部检测结论。提示TDA 不会修改你的原始 dump 文件分析过程是只读的。同一份 dump 可以反复打开不同版本的 TDA 解析结果可能有细微差别建议团队统一使用同一个版本。3. 死锁与线程等待分析TDA 的检测报告怎么读才不翻车3.1 死锁检测TDA 的 Detected 节点与等锁环路TDA 对死锁的检测逻辑并不玄学它扫描 dump 里每个线程持有的监视器锁和正在等待的锁然后构建一张「线程 - 锁 - 线程」的有向图如果发现环就认定存在死锁。jstack 输出的文本里如果有Found one Java-level deadlock段落TDA 会把这些信息提取出来做成可视化链路即使 jstack 没明确打印TDA 也会尝试从各线程的waiting to lock信息里重建锁等待链。实操里我见过最典型的一个死锁场景是线程 A 持有锁 X等待锁 Y线程 B 持有锁 Y等待锁 X。dump 文件里这两行信息往往隔得很远用文本编辑器看特别容易漏但在 TDA 的底部检测面板里两条线程会被串成一个环一眼就明白了。# 在 dump 文件里快速确认锁等待关系 grep -n waiting to lock dump_20240101_120000.txt这条命令的用处是辅助验证 TDA 的结论——如果 TDA 报死锁原始 dump 里必然有对应的waiting to lock记录。我习惯在 TDA 检测结论出来后回 dump 文件里 grep 一遍对应的锁地址确认不是解析器误报。特别是当 TDA 报出的锁地址在原始 dump 里找不到持有者时要警惕这个死锁可能已经被 JVM 的锁粗化或逃逸分析优化掉了实际影响有限。3.2 线程池饥饿全是 WAITING 却找不到 BLOCKED 的隐形风险死锁是最容易识别的但在我经手的线上故障里线程池饥饿比死锁频繁得多。线程池里所有线程都变成 WAITING服务表现是「请求进来了但没人处理」从外部看和死锁几乎一样可 TDA 的死锁检测面板往往是空的。原因是线程池线程都阻塞在park或poll(timeout)上等待队列里的任务它们没有被任何锁阻塞不构成死锁环。TDA 不会把这个标记为错误但「所有 worker 线程全部 WAITING」这个特征分布在左侧线程列表里需要你自己去发现。这时候我一般这么操作在 TDA 左侧线程列表里按线程名排序找到业务线程池的线程名前缀比如http-nio-8080-exec-、pool-3-thread-数一下 WAITING 的数量。如果核心线程数和最大线程数全部 WAITING基本就是线程池耗尽。TDA 的搜索框支持关键字过滤直接输入线程名前缀比在左侧树里一个个翻快得多。线程池饥饿的根源通常是某个任务在同步等待一个永远不会返回的结果比如调用外部接口超时时间设成了无限或者数据库连接池被占满。这时要顺着某一个 WAITING 线程的完整栈往下看找到它到底卡在哪个调用上。TDA 右侧的栈帧就是为这个准备的。3.3 实战推演一个消费者线程池假死的定位过程复盘一次真实的定位过程某个内部系统用的是自定义消费者线程池固定 10 个线程从队列里取消息处理。某天业务方反馈「消息积压消费者不消费了」上去看进程还活着CPU 也很低典型的假死。我先连续抓了三份线程 dump间隔 10 秒for i in 1 2 3; do jstack -l $(jps -l | grep ConsumerApp | awk {print $1}) dump_$i.txt sleep 10 done三份 dump 全部拉回本地后用 TDA 打开。TDA 左侧线程列表里10 个消费者线程全都显示为 WAITING底部检测面板没有任何死锁告警。逐个点开线程看栈顶所有线程都停在LinkedBlockingQueue.take或poll上也就是说队列是空的线程在等任务这种状态其实是健康的。那问题在哪继续往下翻发现还有一个ScheduledThreadPoolExecutor的线程在 RUNNABLE栈顶是某个心跳任务的socketRead再仔细看这个心跳任务持有了一把 ReentrantLock而消费者线程在处理业务时也要拿同一把锁。那 10 个消费者线程其实不止一次尝试获取锁失败只是当我把 dump 的时候它们恰好处于队列 take 的等待态。如果我只抓一份 dump大概率会误判成「队列空系统正常」。这个案例暴露了线程分析的第一原则单份 dump 只能说明「某一瞬间线程在干什么」要判断系统的整体状态至少两份、最好三份以上。TDA 支持同时打开多份 dump 文件在窗口间切换对比线程状态迁移后面第 4 章还会细讲这个方法。4. 高 CPU 与性能瓶颈定位用 TDA 配合采样脚本快速锁定线程4.1 把 PID 转成 nidtop -Hp 加 printf 的换算脚本线上服务 CPU 飙高时单纯抓线程 dump 还不够你需要在 dump 里找到「到底哪个线程在疯狂耗 CPU」。常见做法是先用 top 定位到进程再按线程维度查看# 找到 Java 进程 PID top -p $(jps -l | grep BusiApp | awk {print $1}) # 进入 top 后按 H 切换到线程模式记下 CPU 最高的线程 PID # 假设线程 PID 是 28461转成十六进制 printf %x\n 28461printf %x\n 28461的输出是6f2d这个值就是 dump 文件里线程的nid0x6f2d。回到 dump 文件里搜索grep -A 20 nid0x6f2d dump_20240101_120000.txt这条命令会列出该线程的完整调用栈十有八九就是它在一遍遍执行某个热循环。TDA 左侧线程列表里也会显示每个线程的 nid如果原始 dump 是你自己抓的直接用 TDA 打开后按 nid 搜索同样能命中。需要注意的是top 里的线程 PID 和 JVM 内部的 nid 对应关系只在抓 dump 的那个节点成立如果服务重启过对应关系就失效了。4.2 在 TDA 里过滤和搜索按状态筛选与关键字定位TDA 的搜索框支持的过滤能力对高 CPU 定位很有帮助。比如你已经通过上面的脚本锁定了 nid0x6f2d在 TDA 的搜索框里直接输入0x6f2d左侧列表会立刻过滤出对应的线程。更常用的是按状态过滤点左侧列表上方的状态列排序把 RUNNABLE 全部集中到顶部逐个检查栈顶是不是 GC 线程或业务线程。GC 线程长跑 RUNNABLE 说明内存回收压力大这时候该配合 heap dump 分析业务线程 RUNNABLE 伴随高 CPU基本就是死循环或超长正则匹配之类的热点了。我一般会这样组合先把 RUNNABLE 状态的线程全部展开排除 JVM 内部线程名GC Thread、VM Thread、Compiler Thread等剩下的业务线程逐个看栈。TDA 的线程列表支持按列排序状态列点一下就能分组比在原文里翻高效太多。4.3 线程状态迁移连续三次 dump 看线程「卡在哪一拍」单份 dump 是快照连续快照才能看出趋势。排查高 CPU 问题我习惯在不同时间点抓三份 dump时间间隔视情况而定CPU 持续飙高可以间隔 10~20 秒如果是偶发波动间隔 30~60 秒。采样点线程状态判读第一次 dump线程 A RUNNABLE栈顶在parse()方法疑似业务热点第二次 dump线程 A 依然 RUNNABLE栈顶不变不是偶发确认是热点循环第三次 dump线程 A RUNNABLE但栈顶变成Unsafe.park说明它已经处理完进入等待热点转移了三次 dump 全部载入 TDA在多个窗口之间切换对比能清晰看到「谁从 RUNNABLE 变成 WAITING」「谁一直卡在同一个方法」。这个方法对死锁、线程池饥饿、高 CPU 三类问题通吃。三份 dump 间隔太短会得到几乎相同的快照间隔太长热点可能已经转移我的经验是先从 10 秒起步根据业务耗时调整。提示生产环境抓 dump 前先确认服务是否处于高负载如果 CPU 已经被业务吃满jstack 会进一步加剧延迟。抓完第一份立刻判断是否值得继续不要机械地抓满三次。5. 避坑记录TDA 常见问题与误判排查5.1 打不开 jar 或界面空白Java 版本过新或过旧现象双击 tda.jar 没反应或java -jar tda.jar启动后窗口一闪而过界面空白。原因TDA 2.3.3 发布较早内部使用了 Swing 组件对太新的 JDK比如某些 JDK 17 环境存在兼容问题也会在老旧的 JDK 6/7 上报UnsupportedClassVersionError。解决先java -version确认版本推荐用 JDK 8 或 JDK 11 启动 TDA。如果机器上同时装了多个 JDK指定路径启动# 用 JDK 8 启动避免高版本 JDK 的模块限制 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar tda.jar如果必须用 JDK 17 运行优先考虑在本地开发机分析服务器上只负责抓 dump。实测下来 JDK 11 是最稳的界面渲染和内存占用都比较正常。5.2 dump 文件解析失败或结果为空文件格式不对现象TDA 打开 dump 文件后左侧列表为空或者提示无法解析部分线程能显示但栈帧不完整。原因dump 文件不是纯文本的 jstack 输出而是来自其他工具。比如某些监控平台导出的是 JSON 格式、或者jstack输出被 shell 重定向时混入了 ANSI 彩色转义码TDA 的解析器只认标准的 jstack 文本格式。解决先用file dump.txt确认格式再用sed清理转义码然后手动提取有效段# 去掉 ANSI 转义码后重新保存 sed -e s/\x1b\[[0-9;]*m//g dump_raw.txt dump_clean.txt另外确保 dump 文件里有完整的线程状态段也就是每段以线程名开头包含java.lang.Thread.State和at xxx栈帧信息。如果是从 Kubernetes 容器里kubectl exec抓的 dump先cat一份出来看开头几行确认格式没被容器日志系统拆散。5.3 死锁检测漏报JVM 没标 deadlock 时要手推栈现象业务方确信存在死锁但 TDA 底部检测面板没有死锁告警。原因TDA 依赖的锁信息不全。jstack -l输出的锁信息对 ReentrantLock 这类显式锁通常显示在Locked ownable synchronizers段但如果被分析的是 synchronized 块且锁是对象监视器TDA 有时无法从文本里重建完整的锁等待环。解决不要只依赖 TDA 的自动化结论。手动在左侧线程列表里筛选 BLOCKED 状态的线程逐个查看其waiting to lock和locked行# 直接查锁关键字 grep -E locked|waiting to lock|parking to wait dump_clean.txt | head -50如果发现线程 A 等待的锁地址 0x00000000abcd1234 在线程 B 的持有列表里出现而 B 又在等其他锁就用笔在纸上画出环。TDA 不是银弹它帮你省掉 80% 的翻文本时间剩下 20% 的判断还是得靠人。5.4 超大 dump 卡顿堆内存不足和 GC 线程干扰现象打开几百 MB 或上万线程的 dump 文件后TDA 界面长时间无响应点击一次要等好几秒。原因TDA 默认堆内存不够解析过程中频繁触发 Full GC同时 dump 里包含大量 JVM 内部线程渲染时拖慢速度。解决启动时给足内存并配合关键字过滤缩小分析面java -Xmx4g -XX:UseG1GC -jar tda.jar载入后先别急着全选在搜索框输入业务线程名特征过滤掉 GC 线程、JitWorker、VM Periodic Task Thread等系统线程聚焦到业务线程之后界面会流畅很多。如果 dump 实在太大可以考虑先用脚本把 dump 文件拆成多份按线程名前缀拆分后再分次载入。5.5 服务器上起不来 GUI 的替代方案现象线上服务器是无桌面环境纯 Linux 文本模式java -jar tda.jar报HeadlessException或Cant connect to X11 window server。原因TDA 是 GUI 工具需要图形环境或 X11 转发。解决不要试图在服务器上跑界面。正确流程是服务器上只抓 dump 文件下载到本地工作机用 TDA 分析。这一步可以用scp或带转义的sz把文件拉下来# 服务器上抓 dump jstack -l 12345 /tmp/dump_20240101.txt # 本地工作机拉取 scp userserver:/tmp/dump_20240101.txt ./analysis/如果服务器和本地网络隔离也可以先在服务器上用grep做一次粗筛把 BLOCKED 线程的状态段提取出来生成一个精简文件传回本地。TDA 对精简后的文本同样能解析。6. 进阶技巧把 TDA 变成排障流程里的固定一环排障这件事工具只占一半另一半是流程。我踩过最大的坑是凌晨抓了 dump随手命名dump.txt放在服务器 /tmp 下第二天想起来再分析时已经分不清这份 dump 对应哪个故障时段、哪个线程池状态了。所以我现在强制自己走一套固定的快照规则每次故障现场至少抓三份 dump按应用名_日期_时刻_序号.txt命名抓完立刻用 sha256 记录文件哈希并写一个现场的概要说明文件。这样做的好处是事后即使过了几天打开 TDA 依然能准确还原当时的线程状态迁移过程。给一个简化版的现场快照脚本TS$(date %Y%m%d_%H%M%S) PID$(jps -l | grep BusiApp | awk {print $1}) for i in 1 2 3; do jstack -l $PID ${APP}_${TS}_${i}.txt sleep 10 done echo $TS $PID snapshot_meta.txt用 TDA 打开这三份文件时按时间顺序逐个观察业务线程的状态变化。如果线程一直 RUNNABLE 且栈顶固定就是热点循环如果从 RUNNABLE 变成 WAITING则是任务处理完了或在等外部资源如果全部 WAITING 且线程池名称不变就去队列深度和连接池配置里找根因。配合第 4 章的 nid 换算脚本把操作系统层的线程 CPU 数据和 JVM 层的调用栈对齐排障结论才立得住。从那以后我每接到一个线程类故障都会先确认拿到的是不是符合命名规范的完整 dump再决定要不要打开 TDA——工具能帮我省掉翻文本的时间但决定分析质量的是采样时机和文件完整性。这份 tda-bin-2.3.3.zip 值得放进你的工具箱希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI培训学什么?算法、数据、应用三条技术栈完整拆解

AI培训学什么?算法、数据、应用三条技术栈完整拆解

每次有朋友问我 AI 培训主要学什么,我都先反问一句:你想让模型从你手里长出来,还是只想把现成的模型用好?这个问题不解决,后面的课表再丰富也没用。很多人一听说 AI,就觉得先要把数学啃穿才有资格学&#x…

2026/10/18 8:55:22 阅读更多 →
Java 实现 Word 转 PDF:基于 Aspose.Words 21.11 的完整方案与避坑指南

Java 实现 Word 转 PDF:基于 Aspose.Words 21.11 的完整方案与避坑指南

简介:面向Java开发者,这份Word转PDF工具包基于Aspose.Words 21.11版本,并专门为JDK 17环境做了适配,可有效解决传统转换方案中依赖冲突或版本不兼容的难题。压缩包内共2个文件,包含一个可按Maven坐标直接引用的核心jar…

2026/10/18 8:55:22 阅读更多 →
动态非合作博弈框架下大规模电动汽车配电网调度Matlab实现

动态非合作博弈框架下大规模电动汽车配电网调度Matlab实现

最近半年,陆陆续续有搞电力电子的同行问我:大规模电动汽车接入配电网之后,调度到底该怎么做?尤其是在“车桩分离、分散决策”的现实条件下,集中式优化还有没有戏?这个问题,我在某高校实验室的实…

2026/10/18 8:55:22 阅读更多 →

最新新闻

C# IOCP高性能Socket服务:池化设计与5000+并发实战

C# IOCP高性能Socket服务:池化设计与5000+并发实战

简介:这是一份面向C#中高级开发者与网络编程学习者的Socket高性能异步通信实战示例,聚焦.NET Framework下SocketAsyncEventArgs核心机制的应用落地,解决传统Begin/End模式性能瓶颈与高并发连接管理难题。资源包含20个文件,以6个核…

2026/10/18 9:47:34 阅读更多 →
VS2019无法定位程序输入点到IPHLPAPI.DLL?排查与修复全指南

VS2019无法定位程序输入点到IPHLPAPI.DLL?排查与修复全指南

前阵子接手一台旧开发机,双击 Visual Studio 2019 的图标,启动画面刚出来,屏幕上就弹了一个对话框,标题栏写着“无法找到入口点”:无法定位程序输入点 RtlGetPersistedStateLocation 于动态链接库 IPHLPAPI.DLL 上。点…

2026/10/18 9:47:34 阅读更多 →
基于Java Swing和MySQL的学生选课管理系统全解析

基于Java Swing和MySQL的学生选课管理系统全解析

简介:一套基于Java Swing与MySQL的学生选课管理系统项目,适配IntelliJ IDEA,面向Java初学者及需要完成课程设计、毕业设计的学生。系统划分为系统管理、数据管理和数据查询三大部分:系统管理实现密码设置、用户登录和退出&#xf…

2026/10/18 9:47:34 阅读更多 →
青少年开源参与指南:从零开始第一次PR到开源社区成长路径

青少年开源参与指南:从零开始第一次PR到开源社区成长路径

1. 先从背景说起:为什么会有“青少年开源”这个议题1.1 社区里那些让我意外的年轻人这几年混迹各种开源社区和线下技术活动,有个现象越来越明显:出现在贡献者列表里的年轻面孔越来越多了。以前遇到一个高中生PR(Pull Request&…

2026/10/18 9:47:34 阅读更多 →
李雅普诺夫指数与沃夫算法:从混沌判据到MATLAB实操

李雅普诺夫指数与沃夫算法:从混沌判据到MATLAB实操

简介:本资源是一份面向动力系统与混沌理论研究者的MATLAB实践工具包,聚焦李雅普诺夫指数的数值计算与稳定性判别,特别适合控制工程、非线性科学及时间序列分析方向的研究生与科研人员。压缩包内含1个核心MATLAB脚本文件(lyapunov_…

2026/10/18 9:47:34 阅读更多 →
基于计算机视觉的寄生虫卵自动识别:从数据到部署的实战经验

基于计算机视觉的寄生虫卵自动识别:从数据到部署的实战经验

寄生虫卵的人工镜检,做过的都知道有多费眼睛。我接触过不少基层检验科和疾控实验室的老师,他们每天要看几十上百张涂片,在显微镜下一帧一帧地找虫卵,不仅效率低,而且极度依赖个人经验——同一个视野,老专家…

2026/10/18 9:46:34 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →