Arthas:Java诊断利器实战指南

在Java应用开发和运维中,线上问题排查往往是一场与时间的赛跑。传统的日志分析、重启大法或JVM工具(如jstack、jmap)虽然有效,但存在操作复杂、无法实时追踪等问题。Arthas作为阿里巴巴开源的Java诊断工具,凭借无需重启应用、动态追踪代码、支持热更新等特性,成为开发者排查疑难杂症的"手术刀"。本文将从安装到实战,全面解析Arthas的核心功能。

一、Arthas 的核心优势

无侵入式诊断

无需修改代码或重启服务,直接连接目标JVM进程。

动态追踪能力

实时监控方法调用、参数、返回值、异常等细节。

生产环境友好

提供安全退出机制,避免因误操作导致服务异常。

丰富的命令生态

覆盖线程分析、类加载追踪、性能采样等高频场景。

二、快速安装与配置

  1. 安装方式

下载并启动(自动检测Java进程)

curl -O https://arthas.aliyun.com/arthas-boot.jar

java -jar arthas-boot.jar

启动后会列出当前所有Java进程,输入序号即可连接。

  1. Docker环境使用
    1) 将Arthas复制到容器内
    docker cp arthas-boot.jar <容器ID>:/tmp/
    2) 进入容器并启动
    docker exec -it <容器ID> /bin/bash
    查看java安装路径
    ps -ef |grep java

    启动命令 /openj9jdk/bin/java -jar /tmp/arthas-boot.jar


    结果同上选定位的进程Id

三、高频场景与命令详解

场景1:CPU占用飙升

排查步骤:

  1. 查看最忙的3个线程

    thread -n 3

  2. 追踪高耗时方法(单位:ms)

    trace com.example.Service * '#cost > 200'

  3. 监控方法参数和返回值(研发定位常用)

    1)、只观察返回值:

    watch com..class(包+类) method(方法) returnObj
    2)、观察入参和返回值(遍历深度设置为5,x=5):
    watch com.
    .class(包+类) method(方法) "{params,returnObj}" -x 5 -b -f

    3)、观察入参和返回值,并且根据入参过滤:

    watch com..class(包+类) method(方法) "{params,returnObj}" 'params[2]==true' -x 5 -b -f
    4)、观察入参和返回值(只观察5次调用情况,n=5):
    watch com.
    .class(包+类) method(方法) "{params,returnObj}" -x 1 -f -n 5

    watch com.***.class(包+类) method(方法) "{params,returnObj}" -x 8 -b -e

watch的几个参数的说明:

b\] 在方法调用之前观察 \[e\] 在方法异常之后观察 \[s\] 在方法返回之后观察 \[f\] 在方法结束之后(正常返回和异常返回)观察 \[E\] 开启正则表达式匹配,默认为通配符匹配 \[x:\] 指定输出结果的属性遍历深度,默认为 1 打印类的详细信息: sc -d com.***.class(包+类) 打印出类的Field信息: sc -d -f com.*** .class(包+类) 打印出类的Field信息,遍历深度为2: sc -d -f com.\*\*\*.class(包+类) -x 2 sc的几个参数的说明: \[d\] 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。 如果一个类被多个ClassLoader所加载,则会出现多次 \[E\] 开启正则表达式匹配,默认为通配符匹配 \[f\] 输出当前类的成员变量信息(需要配合参数-d一起使用) \[x:\] 指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出 7、 quit------退出当前 Arthas 客户端,其他 Arthas 客户端不受影响 stop------关闭 Arthas 服务端,所有 Arthas 客户端全部退出 如果只是退出当前的连接,可以用quit或者exit命令。Attach 到目标进程上的 arthas 还会继续运行,端口会保持开放,下次连接时可以直接连接上。 如果想完全退出 arthas,可以执行stop命令。生产环境里,一定要使用stop命令!、 场景2:内存泄漏排查 1. 导出堆内存快照 heapdump --live /tmp/heapdump.hprof 2. 统计对象实例数 ognl '@com.example.LeakyClass@instanceCount' 3. 追踪大对象创建路径 stack com.example.LeakyClass "" 场景3:动态修改日志级别 查看当前Logger配置 logger ## 修改ROOT日志级别为DEBUG logger --name ROOT --level DEBUG 四、核心命令速查表 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/94caa764da4e4448bf7091e6df216418.png) 五、生产环境最佳实践 安全第一 优先使用watch/trace等只读命令,避免redefine热更新引发稳定性问题。 诊断完成后务必执行stop彻底退出,防止残留连接占用资源。 性能影响控制 限制监控次数(-n 5)和遍历深度(-x 3)。 避免对高频方法(如核心交易链路)进行持续监控。 日志与记录 使用history -w /path/to/log保存操作历史。 结合tee命令同时输出到文件和屏幕: trace com.example.Service \* \| tee /tmp/trace.log 六、Arthas 进阶技巧 1. 批量执行命令 ## 通过脚本执行多个命令 java -jar arthas-boot.jar -c "watch com.example.Service method; thread -n 3" 2. 结合Ognl表达式 ## 调用静态方法获取系统配置 ognl '@com.example.ConfigUtils@getConfig("timeout")' ## 修改静态变量(谨慎!) ognl '@com.example.GlobalConfig@DEBUG_MODE=true' 3. 火焰图分析 ## 启动采样(默认持续30秒) profiler start ## 生成HTML格式火焰图 profiler stop --format html ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d92fc0d8b77b4505b0a6a323dcfdf9cf.png) 结语 Arthas 的核心理念是\*\*"看得见的问题才是好问题"\*\*。通过本文的实战指南,开发者可以快速掌握从基础监控到深度诊断的全链路技巧。无论是日常开发中的性能调优,还是凌晨三点的紧急故障排查,Arthas 都能成为你手中最锋利的"瑞士军刀"。 附录: Arthas 官方文档 Arthas 实战案例集 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3dcda5891f8e4c00ae804f08bdcd148b.png)

相关推荐
程序猿七度3 天前
【Arthas实战】使用场景与常用命令
java·jvm·arthas
南客先生22 天前
Arthas在Java程序监控和分析中的应用
java·面试·arthas
兮动人1 个月前
arthas之dump/classloader命令的使用
java·arthas
兮动人2 个月前
arthas之jvm相关命令
jvm·arthas·arthas之jvm相关命令·arthas基础命令
zuihongyan5184 个月前
Arthas监控方法内部调用路径,并输出方法路径上的每个节点上耗时
java·arthas·方法耗时监控
ThisIsClark5 个月前
【问题定位记录】哪些情况可能造成403
问题定位
极客先躯6 个月前
高级java每日一道面试题-2024年11月29日-JVM篇-常见调优工具有哪些?
java·jvm·arthas·jprofiler·gc viewer·patty·jrockit
刘大猫.8 个月前
Arthas sc(查看JVM已加载的类信息 )
jvm·arthas·sc·arthas命令·查看jvm已加载的类信息
刘大猫.8 个月前
Arthas redefine(加载外部的.class文件,redefine到JVM里 )
jvm·arthas·arthas命令·redefine·加载外部的.class文件