简介: Arthas是阿里巴巴开源的Java诊断利器,无需重启应用即可动态追踪JVM运行状态。支持实时监控、线程分析、方法追踪、类反编译、热更新及火焰图生成,集众多工具之大成,助力开发者高效定位线上问题。
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。它最大的优势在于无需修改代码、无需重启应用,即可动态跟踪、诊断线上问题,仿佛给了开发者一台能够透视运行中JVM的“显微镜”和“手术刀”。
核心特性与价值
- 动态诊断: attach到正在运行的JVM进程,实时查看运行状态,动态修改日志级别,甚至热修复代码。
- 功能强大:集成了jstack, jmap, jstat, jad, grep等众多命令行工具的功能,并提供了更强大的增强。
- 开箱即用:只需一个jar包,无需任何前置安装和配置。
- 交互式体验:提供丰富的命令行交互界面和Tab自动补全,体验极佳。
安装与快速入门
安装:
# 直接下载jar包 curl -O https://arthas.aliyun.com/arthas-boot.jar # 或者使用全量包 curl -O https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar -h
启动与连接:
java -jar arthas-boot.jar # 输出示例:会列出当前机器上所有的Java进程,输入序号即可连接。 [INFO] arthas-boot version: 3.6.7 [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. * [1]: 1234 com.example.Application [2]: 5678 org.apache.catalina.startup.Bootstrap # 输入 '1',连接到PID为1234的进程。
连接成功后,你将进入Arthas的命令行交互界面。输入 help 可以查看所有命令。
核心命令详解与实战场景
Arthas命令繁多,以下按功能分类介绍最核心、最常用的命令。
1. 系统概览与实时监控
- dashboard:系统实时监控面板,这是Arthas最常用的命令之一。
- 功能:在一个界面内综合显示线程列表、内存各分区(堆、非堆)使用情况、GC统计、操作系统负载等信息。
- 实战:快速了解应用的整体健康状况。按 q 退出,按 c 继续刷新。ctrl+c 完全退出。
- 操作:直接输入 dashboard 即可。
2. 线程问题诊断
- thread:查看线程信息,功能远超 jstack。
- thread:列出所有线程及其状态。
- thread <id>:查看指定线程的详细堆栈信息。
- thread -n 3:显示当前最忙的(CPU占用率最高的)3个线程。
- thread -b 或 thread --block:一键检测死锁!这是杀手级功能,会直接打印出哪些线程持有了哪些锁,并导致了死锁。
- thread -i 1000:统计最近1000ms内,每个线程的CPU使用时间。
- watch:方法执行数据观测。
- 功能:观察指定方法的调用情况,能查看入参、返回值、抛出异常,甚至方法内的成员变量。
- 语法:watch 全限定类名 方法名 "{params, returnObj, throwExp}" -x 3
- params:参数列表
- returnObj:返回值
- throwExp:异常
- -x 3:指定输出属性的遍历深度(避免显示过长)
- 实战示例:
# 观察Demo类的echo方法,打印其入参和返回值,深度为2
watch com.example.Demo echo "{params, returnObj}" -x 2
# 观察方法执行耗时
watch com.example.Service * '{params, returnObj, #cost}' -x 2
- trace:方法内部调用路径追踪与耗时分析。
- 功能:追踪方法内部的所有子调用,并统计每个节点的耗时,非常适合定位性能瓶颈。
- 实战示例:
# 追踪Test类的run方法,并过滤掉耗时小于10ms的调用 trace com.example.Test run '#cost > 10'
3. 类与代码操作
- jad:反编译指定已加载的类。
- 功能:动态查看JVM中加载的类的字节码反编译后的Java代码。无需找源码,即可确认代码逻辑。
- 实战示例:
jad com.example.service.UserService # 反编译只显示源代码,不显示其他信息 jad --source-only com.example.service.UserService
- mc / redefine:内存编译与热更新类。
- 功能:mc (Memory Compiler) 将.java文件编译成.class字节码。redefine 将编译好的字节码加载到JVM中,替换掉原有的类定义。
- 警告:有风险的操作,限制很多(不能修改方法签名、不能增删字段等),主要用于紧急线上bug修复。
- 流程示例:
- 在本地修改UserService.java的一个方法体。
- mc UserService.java -d /tmp 编译到 /tmp 目录。
- redefine /tmp/UserService.class 热更新到JVM。
4. 高级表达式与调用
- ognl:执行OGNL表达式。
- 功能:这是一个极其强大的功能,可以执行任意OGNL表达式,从而查看甚至修改应用内的静态变量、调用静态方法等。
- 实战示例:
# 获取Spring应用的ApplicationContext(假设是单例静态变量) ognl '@com.example.demo.ApplicationContextProvider@applicationContext' # 获取Spring容器中所有Bean的名字 ognl '#ctx=@com.example.demo.ApplicationContextProvider@applicationContext, #ctx.getBeanDefinitionNames()' # 修改某个静态配置开关(例如Logger的level) ognl '@org.apache.logging.log4j.core.config.Configurator@setRootLevel(@org.apache.logging.log4j.Level@ERROR)'
5. 性能分析与监控
- profiler:集成async-profiler进行采样生成火焰图。
- 功能:无需额外安装,直接使用Arthas即可生成CPU或内存分配火焰图,直观定位性能热点。
- 实战示例:
profiler start # 开始采样 profiler stop --format html --file /tmp/flamegraph.html # 停止并生成HTML格式的CPU火焰图 profiler start -e alloc # 开始采样内存分配 profiler stop --file /tmp/alloc-flamegraph.html # 停止并生成内存分配火焰图
6. 专项命令
- monitor:方法执行监控。
- 功能:定时统计方法的执行次数、成功次数、失败次数、平均RT等。
- 示例:monitor -c 5 com.example.Service checkUser 每5秒统计一次checkUser方法的调用情况。
- stack:输出方法调用的调用路径。
- 功能:快速查看某个方法被调用的完整堆栈路径。常用于定位“谁调用了这个方法”。
- 示例:stack com.example.Utils expensiveMethod
最佳实践与注意事项
- 生产环境慎用:虽然Arthas很安全,但 watch、trace 等命令会对性能有一定影响(尤其是在高频率调用的方法上)。建议在预发或测试环境充分练习,在生产环境使用时明确目标,并尽量使用过滤条件减少输出和开销。
- 权限:运行Arthas的用户需要和目标Java进程是同一用户。
- 防火墙:如果诊断远程服务器,确保服务器的防火墙允许Arthas的连接(默认端口3658)。
- 退出:使用 stop 命令退出Arthas,这会断开与目标JVM的连接,但不会影响目标JVM的正常运行。
总结
Arthas将JVM诊断的能力提升到了一个新的高度。它不再是简单的“只读”监控,而是提供了强大的“交互”和“干预”能力。从查看线程堆栈、反编译代码,到方法调用追踪、动态热更新,Arthas几乎涵盖了线上问题排查的所有场景。掌握Arthas,是每一位追求高效排查问题的Java开发者的必修课。

被折叠的 条评论
为什么被折叠?



