Arthas - 初识阿里开源诊断工具,零基础快速上手

📅 2026/7/15 18:37:27
Arthas - 初识阿里开源诊断工具,零基础快速上手
大家好欢迎来到我的技术博客 在这里我会分享学习笔记、实战经验与技术思考力求用简单的方式讲清楚复杂的问题。 本文将围绕Arthas这个话题展开希望能为你带来一些启发或实用的参考。 无论你是刚入门的新手还是正在进阶的开发者希望你都能有所收获文章目录Arthas - 初识阿里开源诊断工具零基础快速上手 什么是 Arthas为什么需要 Arthas快速安装与启动 ️1. 下载并启动 Arthas Boot核心命令一览 场景一查看 JVM 基本信息 ️使用 dashboard 查看实时仪表盘使用 sysprop 查看系统属性使用 vmtool 获取堆内对象场景二排查接口响应慢问题 ➡️示例 Java 代码使用 trace 命令追踪方法调用场景三查看方法入参和返回值 使用 watch 命令监控方法执行场景四分析线程阻塞问题 模拟线程阻塞代码使用 thread 命令分析线程状态场景五反编译字节码查看源码 使用 jad 反编译类场景六动态修改日志级别 使用 logger 命令修改日志级别场景七监控方法调用次数与成功率 使用 monitor 命令监控方法场景八生成火焰图分析性能瓶颈 使用 profiler 生成火焰图使用 Mermaid 图表理解 Arthas 架构 高级技巧结合 OGNL 表达式操作对象 什么是 OGNL示例获取静态字段值调用静态方法创建对象并测试逻辑场景九类加载问题排查 使用 sc 查找已加载的类场景十在线修复简单 Bug谨慎使用使用 redefine 热更新类Web Console图形化操作界面 ️启动 Web Terminal最佳实践建议 ✅常见问题解答 ❓QArthas 会影响线上性能吗Q支持 JDK 版本有哪些Q能否诊断 Native 方法Q是否支持 Spring Boot Actuator 替代总结 结语 Arthas - 初识阿里开源诊断工具零基础快速上手 在现代 Java 应用开发与运维的世界里线上问题排查始终是每个开发者绕不开的挑战。当系统突然变慢、接口响应超时、内存占用飙升而你又无法轻易重启服务时传统的日志分析和本地调试手段往往显得力不从心。这时一款强大、轻量、无需重启应用即可实时诊断的工具就显得尤为重要。Arthas就是这样一款由阿里巴巴开源的 Java 诊断工具它被誉为“Java 程序员的瑞士军刀”。无论你是开发、测试还是运维工程师只要你在处理 Java 应用Arthas 都能帮你快速定位问题提升效率。本文将带你从零开始认识 Arthas通过实际代码示例、命令详解和可视化图表让你在短时间内掌握这款神器的核心能力并能在真实项目中灵活运用。什么是 ArthasArthas 是一个基于命令行的 Java 诊断工具专为解决生产环境中难以复现的问题而设计。它支持在不修改代码、不重启 JVM 的前提下对正在运行的 Java 进程进行动态监控、方法追踪、性能分析和故障排查。它的核心优势包括无需侵入代码不需要添加任何依赖或修改业务逻辑。⚡实时诊断可以即时查看线程状态、调用栈、方法执行耗时等。丰富的命令集提供数十个实用命令覆盖大部分诊断场景。交互式控制台类似 Linux Shell支持自动补全、历史命令、管道操作。远程诊断支持可通过 Web Console 实现远程连接与操作。官方文档地址https://arthas.aliyun.com/doc为什么需要 Arthas想象一下这个场景你的线上订单系统突然出现大量超时用户投诉不断。你查看日志发现某个orderService.createOrder()方法执行时间异常但日志中没有详细的入参和返回值也无法复现问题。此时你有两个选择修改代码增加详细日志重新打包部署 → 至少需要 30 分钟期间问题持续发生。使用 Arthas 直接连接到线上 JVM实时 trace 这个方法的调用路径、耗时分布、参数值 → 几分钟内定位瓶颈。显然第二种方式更高效也更安全。这就是 Arthas 存在的意义 ——让诊断变得像写 SQL 查询一样简单。快速安装与启动 ️Arthas 提供了多种安装方式最常用的是通过curl或wget下载启动脚本。1. 下载并启动 Arthas Boot打开终端执行以下命令curl-Ohttps://arthas.aliyun.com/arthas-boot.jarjava-jararthas-boot.jar更多安装方式详见官方指南https://arthas.aliyun.com/doc/install-detail.html执行后Arthas 会列出当前机器上所有正在运行的 Java 进程* [1]: 12345 com.example.DemoApplication [2]: 67890 org.apache.catalina.startup.Bootstrap输入对应的编号如1即可连接到目标进程。连接成功后你会看到熟悉的提示符[arthas12345]$恭喜你现在已进入 Arthas 控制台可以开始诊断之旅了核心命令一览 Arthas 提供了超过 40 个命令覆盖了从基础信息查询到高级性能分析的各个方面。下面我们通过几个典型场景逐步深入学习这些命令的使用。场景一查看 JVM 基本信息 ️当你连接到一个 Java 进程后第一步通常是了解它的运行环境。使用dashboard查看实时仪表盘[arthas12345]$ dashboard该命令会展示一个实时更新的控制面板包含当前时间JVM 运行时长CPU 使用率内存使用情况堆、非堆线程总数及状态分布GC 情况加载的类数量这是一个非常直观的入口帮助你快速判断系统是否处于异常状态。使用sysprop查看系统属性[arthas12345]$ sysprop列出所有的 JVM 系统属性例如java.version、user.home、file.encoding等。你也可以查看单个属性[arthas12345]$ sysprop java.version输出java.version: 17.0.8使用vmtool获取堆内对象[arthas12345]$ vmtool--actiongetInstances--classNamejava.lang.String--limit5该命令会获取堆中前 5 个String对象的实例适用于分析内存中某些类的分布情况。场景二排查接口响应慢问题 ➡️假设我们有一个 Spring Boot 应用其中某个 REST 接口/api/order响应缓慢。我们可以使用 Arthas 来追踪方法调用链。示例 Java 代码先来看一段模拟的业务代码RestControllerpublicclassOrderController{GetMapping(/api/order)publicStringcreateOrder(RequestParamStringuserId){try{Thread.sleep(2000);// 模拟耗时操作}catch(InterruptedExceptione){Thread.currentThread().interrupt();}returnOrder created for user: userId;}}这是一个典型的“睡眠 2 秒”来模拟数据库查询或远程调用的场景。现在我们想确认到底是谁在耗时以及参数是什么。使用trace命令追踪方法调用[arthas12345]$ trace *OrderController createOrder当你再次访问/api/order?userIdU12345时Arthas 会输出如下结果---ts2025-04-05 10:20:30;thread_namehttp-nio-8080-exec-1;id0x1;is_daemontrue;priority5;TCCLorg.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader ---[1998.12ms] com.example.OrderController:createOrder() ---[1998.01ms] sleep()可以看到createOrder方法耗时约 2 秒几乎全部消耗在Thread.sleep()上。这说明问题出在模拟的延迟操作中。 提示trace支持通配符匹配类名和方法名非常适合不知道完整类路径时使用。场景三查看方法入参和返回值 有时候我们不仅想知道方法耗时还想看看传了什么参数返回了什么结果。使用watch命令监控方法执行[arthas12345]$watch*OrderController createOrder{params, returnObj}-x3解释一下参数{params, returnObj}表示我们要观察的表达式即参数和返回对象。-x 3展开对象层级最多显示 3 层嵌套。再次请求接口后输出如下methodcom.example.OrderController.createOrder locationAtExit ts2025-04-05 10:25:10 id0x2 params[[U12345]] returnObjOrder created for user: U12345太棒了我们现在清楚地看到了输入参数是U12345返回值也符合预期。你还可以加上条件过滤比如只监控特定用户的调用[arthas12345]$watch*OrderController createOrder returnObjparams[0]U12345这样只有当userId U12345时才会触发监听。场景四分析线程阻塞问题 线程死锁或长时间阻塞是线上常见的性能瓶颈。Arthas 提供了强大的线程分析能力。模拟线程阻塞代码ServicepublicclassBlockService{privatefinalObjectlock1newObject();privatefinalObjectlock2newObject();publicvoiddeadlockDemo(){newThread(()-{synchronized(lock1){System.out.println(Thread-1 got lock1);try{Thread.sleep(1000);}catch(InterruptedExceptione){}System.out.println(Thread-1 trying to get lock2);synchronized(lock2){System.out.println(Thread-1 got lock2);}}}).start();newThread(()-{synchronized(lock2){System.out.println(Thread-2 got lock2);try{Thread.sleep(1000);}catch(InterruptedExceptione){}System.out.println(Thread-2 trying to get lock1);synchronized(lock1){System.out.println(Thread-2 got lock1);}}}).start();}}这段代码极有可能导致死锁。虽然不一定每次都会发生但它足以用来演示如何检测潜在风险。使用thread命令分析线程状态[arthas12345]$ thread该命令列出所有线程的基本信息包括 ID、名称、状态和 CPU 占比。重点关注状态为BLOCKED或WAITING的线程。进一步查看具体线程堆栈[arthas12345]$ thread15输出可能类似于Thread-1 Id15 BLOCKED on java.lang.Object6bdf8c8d owned by Thread-2 Id16 at com.example.BlockService.lambda$deadlockDemo$0(BlockService.java:15) - blocked on java.lang.Object6bdf8c8d - locked java.lang.Object6bdf8c8d at java.base17.0.8/java.lang.Thread.run(Thread.java:833)如果你怀疑存在死锁可以直接使用[arthas12345]$ thread-bArthas 会自动检测是否存在死锁并报告涉及的线程和锁。输出示例Found one Java-level deadlock: Thread-1: waiting to lock monitor 0x00007f8a4c003c58 (object 0x000000076bdf8c8d, a java.lang.Object), which is held by Thread-2 Thread-2: waiting to lock monitor 0x00007f8a4c006b98 (object 0x000000076bdf8ca5, a java.lang.Object), which is held by Thread-1这是非常宝贵的诊断信息能够帮助你迅速定位并发问题根源。场景五反编译字节码查看源码 有时候你连接到一个线上服务却找不到对应的源码或者怀疑代码被篡改。这时可以使用jad命令反编译类文件。使用jad反编译类[arthas12345]$ jad *OrderController输出将是该类的 Java 源码形式基于字节码还原publicclassOrderController{publicOrderController(){}GetMapping(value/api/order)publicStringcreateOrder(StringuserId){try{Thread.sleep(2000L);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}returnOrder created for user: userId;}}你甚至可以将结果保存到文件[arthas12345]$ jad *OrderController/tmp/OrderController.java这对于审计、调试第三方库或分析混淆代码非常有用。场景六动态修改日志级别 很多项目使用 SLF4J Logback 或 Log4j2 作为日志框架。当出现问题时往往需要提高日志级别以便查看更多细节。传统做法是修改配置文件并重启服务但现在你可以用 Arthas 动态调整。使用logger命令修改日志级别[arthas12345]$ logger--nameROOT--levelDEBUG这条命令将根日志器的日志级别设置为DEBUG。查看当前日志配置[arthas12345]$ logger输出会列出所有 logger 名称、级别、附加器等信息。你也可以针对特定包设置级别[arthas12345]$ logger--namecom.example.service--levelTRACE无需重启立即生效这对临时排查问题非常友好。场景七监控方法调用次数与成功率 有时我们需要统计某个方法被调用了多少次失败率是多少。这在微服务架构中尤其重要。使用monitor命令监控方法[arthas12345]$ monitor-c5*OrderController createOrder-c 5表示每 5 秒统计一次。输出示例timestamp class method total success fail cost(avg) 2025-04-05 10:40:00 OrderController createOrder 3 3 0 1987.23 2025-04-05 10:40:05 OrderController createOrder 2 2 0 2001.45这个表格清晰地展示了单位时间内的调用量、成功率和平均耗时可用于初步判断接口稳定性。场景八生成火焰图分析性能瓶颈 火焰图Flame Graph是一种可视化性能分析工具能直观展示哪些方法占用了最多 CPU 时间。Arthas 内置了profiler命令可生成兼容标准格式的火焰图。使用profiler生成火焰图[arthas12345]$ profiler start启动后Arthas 开始采样 JVM 的执行栈。等待一段时间比如 30 秒然后停止[arthas12345]$ profiler stop默认会生成一个html文件你可以下载并在浏览器中打开查看火焰图。你也可以指定输出路径[arthas12345]$ profiler stop--output/data/logs/flamegraph.html此外还支持导出为jfr格式供 JMC 分析[arthas12345]$ profiler stop--formatjfr--output/data/logs/record.jfr更多关于火焰图的原理请参考http://www.brendangregg.com/flamegraphs.html使用 Mermaid 图表理解 Arthas 架构 为了更好地理解 Arthas 的工作原理我们可以通过 Mermaid 图表来展示其内部结构。双向通信WebSocket 连接用户终端Arthas Client通信方式TelnetHTTP/WebSocketJVM 进程Arthas AgentByteBuddy 字节码增强Java Attach API 注入JMX MBean 暴露外部工具Web Console如上图所示Arthas 通过Java Attach API将自身注入到目标 JVM 中成为一个Agent。Agent 利用ByteBuddy对目标类进行字节码增强实现方法拦截、耗时统计等功能。用户通过Telnet 或 HTTP连接到 Agent发送命令并接收结果。支持 Web Console便于团队协作和远程诊断。这种非侵入式的设计保证了 Arthas 在生产环境中的安全性与稳定性。高级技巧结合 OGNL 表达式操作对象 Arthas 支持使用 OGNLObject-Graph Navigation Language表达式来动态访问和操作 Java 对象。这使得你可以像写脚本一样操控运行时数据。什么是 OGNLOGNL 是一种功能强大的表达式语言允许你通过字符串访问对象的属性、调用方法、创建集合等。示例获取静态字段值假设我们有一个类publicclassGlobalConfig{publicstaticStringENVprod;publicstaticMapString,StringsettingsnewHashMap();static{settings.put(timeout,5000);settings.put(retry,3);}}使用getstatic命令读取静态字段[arthas12345]$ getstatic com.example.GlobalConfig ENV输出field: ENV String[prod]读取 map 中的值[arthas12345]$ getstatic com.example.GlobalConfig settingssettings.get(timeout)输出String[5000]调用静态方法[arthas12345]$ ognlcom.example.GlobalConfigreloadSettings()这会调用GlobalConfig.reloadSettings()静态方法。创建对象并测试逻辑[arthas12345]$ ognl#objnew com.example.User(), #obj.setName(test), #obj.getName()虽然不能真正改变业务逻辑但在调试时非常有用。场景九类加载问题排查 Java 中的类加载机制复杂常见的问题包括同名类来自不同 jar 包类找不到ClassNotFoundException方法不存在NoSuchMethodErrorArthas 提供了classloader和sc命令来帮助分析。使用sc查找已加载的类[arthas12345]$ sc *OrderController输出CLASS-LOADER HASH CLASS-QNAME -sun.misc.Launcher$AppClassLoader18b4aac2 18b4aac2 com.example.OrderController你可以看到这个类是由哪个 ClassLoader 加载的。进一步查看 ClassLoader 的层次结构[arthas12345]$ classloader输出类似name numberOfInstances loadedCountTotal BootstrapClassLoader 1 3456 PlatformClassLoader 1 120 AppClassLoader 1 450如果遇到类冲突可以使用[arthas12345]$ sc-dcom.example.util.StringUtils查看具体的加载路径和来源 jar 包。场景十在线修复简单 Bug谨慎使用虽然不推荐在生产环境随意修改代码但在极端情况下Arthas 提供了redefine命令允许你热替换类定义。使用redefine热更新类前提是你已经编译好了新的.class文件。[arthas12345]$ redefine /tmp/FixedOrderController.class该命令会替换 JVM 中原有的类定义不会触发初始化逻辑且仅限于方法体变更不能修改字段或方法签名。⚠️ 警告此操作有风险可能导致不可预知的行为建议仅用于紧急修复且充分测试后使用。Web Console图形化操作界面 ️除了命令行Arthas 还提供了 Web Console支持通过浏览器连接到 Arthas Agent进行可视化操作。启动 Web Terminal在启动 Arthas 时添加--tunnel-server参数java-jararthas-boot.jar --tunnel-serverws://*:7777--agent-id abcdefg然后访问 https://arthas.aliyun.com/doc/web-console.html输入对应的agent-id即可连接。Web Console 支持多用户协作、命令历史、结果高亮、图形化 dashboard 等特性特别适合团队共享诊断会话。最佳实践建议 ✅在使用 Arthas 时遵循以下最佳实践可以最大化其价值并降低风险权限控制生产环境应限制可连接 Arthas 的 IP 地址避免未授权访问。操作记录开启命令审计日志记录谁在什么时候执行了什么命令。避免高频采样trace、monitor等命令有一定性能开销不要长时间开启。结合监控系统将 Arthas 与 Prometheus、Grafana 等工具结合形成完整可观测体系。定期培训组织团队成员学习 Arthas 常用命令提升整体排障能力。常见问题解答 ❓QArthas 会影响线上性能吗A轻微影响。大多数命令采用异步采样或事件驱动只有在触发时才会产生少量开销。但像trace这类深度追踪命令应慎用。Q支持 JDK 版本有哪些A支持 JDK 6 及以上版本包括 OpenJDK、Oracle JDK、Alibaba Dragonwell 等主流发行版。Q能否诊断 Native 方法A不能。Arthas 基于字节码增强只能拦截 Java 方法调用。Q是否支持 Spring Boot Actuator 替代A不完全替代。Actuator 提供健康检查、指标暴露等标准化接口Arthas 更偏向于临时性、交互式的深度诊断。两者互补。总结 Arthas 作为一款由阿里开源的 Java 诊断利器彻底改变了我们对线上问题的认知方式。它让我们不再局限于“看日志 → 猜问题 → 改代码 → 重发版”的低效循环而是能够直接深入 JVM 内部实时观测、精准定位、快速解决。通过本文的学习你应该已经掌握了如何安装和连接 Arthas使用dashboard、thread、trace、watch等核心命令分析性能瓶颈、线程阻塞、类加载等问题利用 OGNL 和 Web Console 提升效率在真实项目中安全、有效地使用 Arthas官方完整文档https://arthas.aliyun.com/doc无论你是刚入门的新手还是经验丰富的架构师Arthas 都值得你花时间去深入了解。把它加入你的工具箱让它成为你应对线上危机时最可靠的伙伴。结语 技术的发展从未停止而我们的学习也不应止步。Arthas 不仅仅是一个工具它代表了一种面向运行时的思维方式—— 我们不仅要写出正确的代码更要学会如何观察它、理解它、优化它。愿你在每一次深夜救火中都能从容不迫在每一个棘手 Bug 面前都有 Arthas 为你照亮前路。Happy diagnosing! 感谢你读到这里 技术之路没有捷径但每一次阅读、思考和实践都在悄悄拉近你与目标的距离。 如果本文对你有帮助不妨 点赞、收藏、分享给更多需要的朋友 欢迎在评论区留下你的想法、疑问或建议我会一一回复我们一起交流、共同成长 关注我不错过下一篇干货我们下期再见✨