Arthas:线上 Java 问题排查,不用重启不用改代码
Arthas:线上 Java 问题排查,不用重启不用改代码
做 Java 开发的人,最怕的就是线上出 bug。测试环境复现不了,加日志要走发版流程,远程调试又会卡住所有线程。阿里的 Arthas 就是为这个场景生的——一个 Java 诊断工具,37000 多个 Star,说明踩过这个坑的人真不少。

它到底能干嘛
Arthas 本质上是一个 Java 进程的"体检仪"。它通过 Attach 机制连上正在运行的 JVM,以观察者的身份工作,不会暂停你的业务线程。
具体能做的事情挺多:
查类加载问题。jar 包冲突是 Java 项目的常见坑,Arthas 可以查某个类是从哪个 jar 加载的,还能反编译看实际执行的代码是不是你以为的那个版本。
看方法调用。可以 watch 一个方法的入参、返回值、异常信息,也能 trace 一个方法的调用链路,找出到底是哪个子调用慢了。
监控统计。支持对方法调用做实时统计,QPS、响应时间、成功率这些指标都能看到。还能看线程状态、CPU 占用、GC 情况。
火焰图。内置 profiler 命令,直接生成火焰图,性能分析不用再折腾 async-profiler 的安装了。
堆对象查看。vmtool 命令可以拿到堆里指定类的实例对象,排查内存问题方便不少。

上手有多简单
两行命令就能跑起来:
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
它会自动列出当前机器上所有 Java 进程,你选一个就连上了。进去之后是命令行交互界面,支持 Tab 补全,对习惯终端的人来说很友好。
不想下载 jar 也行,Linux 和 Mac 上可以用一行脚本安装:
curl -L https://arthas.aliyun.com/install.sh | sh
连上之后,dashboard 命令直接展示线程、内存、GC 的全局状态。thread -n 3 看 CPU 占用最高的三个线程。jad 加类名直接反编译。sc -d 查类的详细信息包括类加载器层级。这些命令组合起来,线上问题基本能定位个八九不离十。
为什么这个工具能活这么久
Arthas 从 2018 年开源到现在,一直有在更新。4.x 版本支持 JDK 8 到 JDK 25,覆盖 Linux、Mac、Windows 三个平台。
能做到这点,一方面是因为阿里的业务体量摆在那儿,线上 Java 服务多,诊断需求是刚需,工具必须持续维护。另一方面是 Arthas 的设计思路对了——它只做观察,不侵入业务代码,不需要重启 JVM,这让它在生产环境用起来没有心理负担。
还有一点,它支持 telnet 和 websocket 两种连接方式。本地排查用命令行,远程排查可以通过浏览器连 Web Console。在容器化部署的场景下,这个设计很实用。
谁适合用
只要你写 Java,大概率会遇到线上问题排查的场景。用 System.out.println 打日志然后等发版,效率太低了。Arthas 能让你在不停机的情况下拿到运行时信息,这对线上服务来说价值很大。
特别是做微服务的团队,服务一多,链路一长,出问题定位成本很高。Arthas 的 trace 和 stack 命令在这种场景下特别好用,能快速看出调用链路里哪一环出了问题。
当然它也有局限。复杂的堆分析还是得靠 MAT 这类专业工具。Arthas 的定位是轻量级的实时诊断,不是全功能的 APM。但就它负责的这部分来说,做得够用。
AT 这类专业工具。Arthas 的定位是轻量级的实时诊断,不是全功能的 APM。但就它负责的这部分来说,做得够用。
更多推荐


所有评论(0)