Arthas trace 命令怎么用?一行定位最慢那行代码
大家好我是程序员天天困。这是「Arthas 线上诊断实战」系列第 2 篇。上一篇讲完 watch 命令实战很多读者有疑问入参对了、返回值也对了可我还是不知道代码到底走了哪条分支接口慢又该盯哪一层。答案就是Arthas trace贴一条命令调用树和行号直接告诉你走了哪条分支、哪一层最耗时。点个收藏我们直接上手。一、watch 的盲区只见结果不见过程还是用系列同款计算器接口RequestMapping(path/user/calculate,methodRequestMethod.GET)publicIntegercalculate(RequestParam(x)Integerx,RequestParam(y)Integery,RequestParam(nameop)Stringop){returndoCalculate(x,y,op)1;}publicintdoCalculate(intx,inty,Stringop){if(add.equals(op))returnxy;elseif(sub.equals(op))returnx-y;elseif(mul.equals(op))returnx*y;elseif(div.equals(op))returnx/y;elsethrownewUnsupportedOperationException(NotSupportOpop);}假设请求是x2y2opadd。你用 watch 盯doCalculatewatchcom.ttk.controller.WebController doCalculate\{params,returnObj,throwExp}-n5-x3返回值是4。问题来了22也是 42*2也是 4。watch 只告诉你「结果是 4」不告诉你到底走进了add还是mul。watch 擅长验结果不擅长验路径。线上最常见的「接口慢但不知道慢在哪」就卡在这个盲区上。二、Arthas trace 是什么给方法内部装行车记录仪Arthas trace方法路径追踪Arthas 用来打印某个方法内部调用路径、并统计路径上每个节点耗时的命令。你可以把它理解成「给方法内部装上行车记录仪」走过哪条岔路、每一段花了多少毫秒仪表盘上全有。官方文档对它的定位很直接主动搜索匹配方法的调用路径渲染整条链路上的性能开销。搜索关键词「Arthas trace 官方文档」即可找到最新参数说明。IDEA 里对目标方法右键 → Arthas Command → Trace通常会复制出类似命令trace com.ttk.controller.WebController doCalculate-n5--skipJDKMethodfalse拆开看四个关键点trace启用路径追踪。类全名 方法名被追踪的入口和 watch 一样。-n 5只抓 5 次就退出线上别无限挂着。--skipJDKMethod false是否把 JDK 内部调用也打出来默认跳过。用#cost做耗时过滤#cost是 Arthas 条件表达式里能用的一个变量代表方法执行耗时单位 mswatch / stack / trace 都支持。写法如#cost 100只输出执行超过 100ms 的调用。你可以把它想成「只给超时工单开录像回放」正常的快速调用直接略过噪音少很多。三、Arthas trace 看执行路径代码到底有没有走到先 attach 好进程第 1 篇已讲过此处不重复贴上命令再发请求curlhttp://localhost:8080/user/calculate?x2y2opadd树里的#行号是关键证据它标的是「在被 trace 的那个方法源码的第几行发起了这次调用」。opadd时你会看到执行落到加法对应的那一行。再把op换成mul发一次curlhttp://localhost:8080/user/calculate?x2y2opmul行号对得上分支才算真的走到了。同一个doCalculateopadd和opmul落在两行不同的行号上——这就是 trace 比 watch 多看见的那半边过程。可能有人会问一次 trace 能顺着往下钻十几层吗官方明确说过一次 trace 默认只跟踪匹配方法这一级子调用不会自动无限下钻想看更深要用正则一次匹配多个类方法或用后面说的动态 trace。别指望一条命令把整棵调用树全展开那对线上 JVM 太贵。四、–skipJDKMethodJDK 调用要不要展开默认--skipJDKMethod为true也就是跳过java.*一类调用树更干净。排查业务分支时这样通常够用。当你怀疑慢在字符串拼接、集合操作、或者某个 JDK 工具方法时再打开trace com.ttk.controller.WebController doCalculate\-n3--skipJDKMethodfalse这时树会变「茂盛」StringBuilder、Integer.valueOf之类都会冒出来。信息变多也更容易被噪音淹没。我的习惯是先默认跳过 JDK定位到业务方法后再对可疑节点单独开 false。场景建议原因确认业务 if/else 走到哪--skipJDKMethod true默认树短行号清晰怀疑慢在 JDK/工具方法--skipJDKMethod false能看见 java.* 节点耗时接口整体很慢、调用很深先#cost过滤再决定是否展开 JDK先降噪再放大五、Arthas trace 耗时分析揪出接口最慢那一层路径之外trace 更大的日常价值是找慢点。给控制器加一组串行 sleep 示例RequestMapping(path/user/cost,methodRequestMethod.GET)publicIntegercost()throwsInterruptedException{cost1();cost2();cost3();return1;}publicvoidcost1()throwsInterruptedException{Thread.sleep(100);}publicvoidcost2()throwsInterruptedException{Thread.sleep(200);}publicvoidcost3()throwsInterruptedException{Thread.sleep(300);}预期总耗时大约 600ms。线上等价场景是一个接口串行打了三个下游P99 飙高日志却只有总耗时。trace com.ttk.controller.WebController cost-n5--skipJDKMethodfalse触发请求curlhttp://localhost:8080/user/cost输出里每个子调用都会带耗时Arthas 还会用百分比标出每个子调用占入口耗时的比例占比高的自然就是慢点。一目了然不用猜。请求很频繁时别把所有调用都打出来加上耗时过滤trace com.ttk.controller.WebController cost#cost 200-n5这样只保留总耗时超过 200ms 的样本。可能有人会问trace 出来的毫秒数能不能当性能测试报告别急官方也提醒过——trace 自己有观测开销子节点耗时加总往往小于父节点差值就来自未追踪的 JDK 调用、字节码指令甚至 GC 停顿。六、异常也是一条路径异常对 trace 来说并不是特殊物种只是执行路径的另一种走向。把op改成不支持的值例如curlhttp://localhost:8080/user/calculate?x2y2opadd2再试运行时异常比如除零opdivy0curlhttp://localhost:8080/user/calculate?x2y0opdiv异常现场要用 watch 看对象用 trace 看走到了哪。两者叠在一起比单独翻 error 日志更立体一个告诉你「抛了什么」一个告诉你「从哪条分支抛出来的」。七、动态 trace一层不够就再挖一层Arthas 3.3.0 之后支持动态 trace第一次 trace 入口方法时终端会打印listenerId另开一个 Arthas 连接对可疑子方法再trace ... --listenerId 同一个 id原来的终端里调用树会多长出一层。动态 trace按 listenerId 加深在已有 trace 会话上用同一个listenerId继续增强子方法让调用树多长出一层的能力。你可以把它理解成「行车记录仪先拍主干道发现堵车口再往小巷加一路摄像头」而不是一上来全城监控。这招适合「已经锁定慢在 A还想看 A 里面到底是 B 还是 C」。比一上来用大正则扫半个包要克制线上也更安全。我自己的顺序通常是入口 trace → 看最慢子调用 → 动态加深一层 → 必要时再 watch 该节点的入参。八、watch 和 Arthas trace 怎么搭配维度watchtrace核心问题入参 / 返回值 / 异常对象是什么走了哪条路径、哪段最耗时输出形态观察表达式结果调用树 耗时典型场景结果不对、怀疑多算/少算分支未执行、接口慢常见组合先看结果对不对再看路径与热点实战口诀就一句先 watch 验结果再 trace 验路径和耗时。大部分线上「结果怪」或「延迟高」的问题这两步就能收敛到具体方法甚至具体行号。结语Arthas trace 补上的是 watch 看不见的那半边过程与耗时。会用路径确认分支、会用#cost过滤噪音、知道一次只加深一层你就已经超过很多「只会复制插件命令」的用法。下一篇我会写vmtool聊聊怎么在不重启的前提下直接摸到 JVM 里的对象实例。本文命令参数以 Arthas 官方 trace 文档 为准版本演进时请以官网为准。我是程序员天天困持续分享编程干货。觉得有用的话记得点赞收藏和关注~也欢迎在评论区聊聊你用 Arthas trace 时有没有一次靠行号当场拆穿「假修复」的经历。

相关新闻

视频转PDF终极指南:3步将视频中的PPT内容变为精美文档

视频转PDF终极指南:3步将视频中的PPT内容变为精美文档

视频转PDF终极指南:3步将视频中的PPT内容变为精美文档 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 还在为从视频中手动截图整理PPT而烦恼吗?extract-video…

2026/7/25 19:25:57 阅读更多 →
全球无标记运动捕捉技术发展状况分析及投资前景展望报告2026年版

全球无标记运动捕捉技术发展状况分析及投资前景展望报告2026年版

全球无标记运动捕捉技术发展状况分析及投资前景展望报告2026年版无标记运动捕捉技术市场概述在影视娱乐数字内容创作需求爆发、体育科学训练精准化升级以及医疗康复智能化转型的多重驱动下,无标记运动捕捉技术市场正经历从“传统标记式捕捉”向“人工智能驱动的无感…

2026/7/25 19:24:50 阅读更多 →
高速ADC设计实战:时钟、SYSREF同步与DDC配置全解析

高速ADC设计实战:时钟、SYSREF同步与DDC配置全解析

1. 项目概述与核心价值在5G基站、相控阵雷达或者高端测试测量设备里,高速ADC(模数转换器)的角色,就像是一个站在最前线的“侦察兵”。它的任务是把天线捕捉到的、瞬息万变的模拟信号(比如微弱的雷达回波或者复杂的通信…

2026/7/25 19:25:48 阅读更多 →

最新新闻

AI编程助手Codex实战指南:从API接入到15种应用场景

AI编程助手Codex实战指南:从API接入到15种应用场景

最近在探索AI编程助手时,发现很多开发者对Codex的强大功能感到好奇,但面对零散的教程和复杂的配置,往往无从下手。无论是想用它来辅助代码生成、重构旧项目,还是集成到自己的开发流程中,一个系统、完整的实战指南都至关重要。本文将为你拆解Codex从零到一的完整使用路径,…

2026/7/25 19:25:15 阅读更多 →
【大话云原生】煮饺子与docker、kubernetes之间的关系

【大话云原生】煮饺子与docker、kubernetes之间的关系

【大话云原生】煮饺子与docker、kubernetes之间的关系 从一盘饺子开始:理解云原生的基础概念想象一下,你是一位家庭主妇,春节要包100个饺子招待亲戚。你面临的第一个问题是:怎么让每个饺子都一模一样?第二个问题是&…

2026/7/25 19:25:15 阅读更多 →
聊聊前序、中序、后序表达式

聊聊前序、中序、后序表达式

聊聊前序、中序、后序表达式 在计算机科学和数学中,表达式的表示方式直接影响计算过程的复杂度和实现方式。我们日常使用的数学表达式,如 3 5 * 2,被称为中序表达式(infix notation),因为运算符位于操作数…

2026/7/25 19:25:15 阅读更多 →
间,最大化 CPU 利用率。 异步编程通过事件循环实现任务调度:当一个任务因 IO 操作需要等待时,事件循环会暂停该任务,切换到其他 ...

间,最大化 CPU 利用率。 异步编程通过事件循环实现任务调度:当一个任务因 IO 操作需要等待时,事件循环会暂停该任务,切换到其他 ...

异步编程:最大化 CPU 利用率的秘密武器 引言:为什么我们需要异步编程?想象一下,你正在一家繁忙的咖啡店排队点单。店员在等咖啡机煮咖啡时,如果只是呆呆站着等,那么后面的顾客就要等更久。但如果店员在等待…

2026/7/25 19:25:15 阅读更多 →
CVE-2022-25845 FastJSON(com.alibaba:fastjson)

CVE-2022-25845 FastJSON(com.alibaba:fastjson)

springboot 升级以及漏洞处理 CVE-2022-25845 FastJSON(com.alibaba:fastjson)包引发的漏洞fastJson-1.2.68.jar com.alibaba.fastjson.parser.ParserConfig com.alibaba.fastjson.parser.deserializer.ThrowableDeserializer FastJSON 默认关闭 auto…

2026/7/25 19:25:15 阅读更多 →
UGC数字人系统开发实战:从AI技术整合到工程架构设计

UGC数字人系统开发实战:从AI技术整合到工程架构设计

在数字人技术从实验室走向大众消费市场的过程中,降低使用门槛一直是核心挑战。JoyAI App 最新推出的 UGC 数字人功能,通过简化生成流程和强化个性化定制,让普通用户也能快速创建专属虚拟玩伴,这标志着数字人技术正从专业工具向日常应用转变。 实际开发一个具备类似能力的数…

2026/7/25 19:24:15 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 5:08:22 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 5:13:53 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻