Cizaii的AI正在绞尽脑汁想思路ING···
CizaiiのAI摘要
gemini-2.5-pro

💡 提示:本文将带您深入了解Arthas这个强大的Java诊断工具,从基础安装到实战应用,助您成为线上问题排查专家!

Arthas(阿尔萨斯)是阿里巴巴在2018年9月开源的一款Java诊断工具

核心特性:支持JDK 6+,命令行交互模式,Tab自动补全,跨平台支持

支持JVM的几乎所有版本

支持Linux/Mac/Windows多平台

提供Tab自动补全功能

命令行交互模式,操作简单


🤔 为什么需要Arthas?

在日常开发中,当遇到以下Java问题时,传统方法往往效率低下:

常见Java问题场景

CPU性能问题

CPU负载飙高,但不知道哪个线程在消耗资源

- 无法快速定位高CPU占用的线程 - 传统profiling工具配置复杂 - 线上环境难以使用重量级监控工具

并发问题

程序出现死锁

- 线程间相互等待导致系统卡死 - 难以实时查看线程状态 - 缺乏有效的死锁检测手段

性能问题

应用响应变慢,不知道什么原因

- 接口响应时间异常 - 方法调用链路不清晰 - 无法实时监控方法执行耗时

代码一致性问题

线上代码和预期的不一致

- 无法确认线上运行的代码版本 - 热部署后代码未生效 - 类加载问题难以排查

调试困难

排查线上问题无法debug

- 生产环境禁止远程调试 - 无法实时查看变量值 - 缺乏动态调试手段

监控缺失

没有JVM监控工具

- 缺乏实时的JVM状态监控 - 无法查看内存、GC等关键指标 - 缺乏历史数据追溯能力

💪 Arthas的价值:正是为解决这些问题而生,它可以帮助开发者进行问题定位、实时监控和热更新代码等操作。

📦 安装和启动Arthas

多种安装方式:Arthas支持多种安装方式,最简单的方式是使用官方提供的arthas-boot.jar

1
2
3
4
5
# 从GitHub下载
curl -O https://arthas.aliyun.com/arthas-boot.jar

# 从Gitee下载(国内用户推荐)
curl -O https://arthas.gitee.io/arthas-boot.jar

启动说明:Arthas是一个Java程序,可以直接使用java -jar命令启动

1
2
3
4
5
# 运行arthas-boot.jar,然后选择要诊断的Java进程
java -jar arthas-boot.jar

# 或者直接指定进程PID
java -jar arthas-boot.jar [PID]

选择进程:运行后,会列出当前系统上的Java进程,选择需要诊断的进程编号即可

1
2
3
$ java -jar arthas-boot.jar
{% span green, * [1]: 12345 com.example.MyApp %}
{% span cyan, [2]: 23456 org.apache.catalina.startup.Bootstrap %}

📋 Arthas常用命令

🎯 命令分类:Arthas提供了丰富的命令来诊断Java程序问题,按功能可分为以下几类

基础操作命令:用于基本的操作和信息查看

命令 功能说明
help 查看命令帮助信息
cat 打印文件内容
grep 搜索满足条件的结果
pwd 返回当前的工作目录
cls 清空当前屏幕区域
session 查看当前会话的信息
reset 重置增强类
version 输出当前目标Java进程所加载的Arthas版本号
quit 退出当前Arthas客户端,不影响其他客户端
shutdown 关闭Arthas服务端,所有客户端都会退出

系统监控命令:用于监控JVM状态和系统性能

命令 功能说明
dashboard 显示当前系统的实时数据面板
thread 查看当前JVM的线程堆栈信息
jvm 查看当前JVM的信息
sysprop 查看和修改JVM的系统属性
sysenv 查看JVM的环境变量
vmoption 查看和修改JVM里诊断相关的option
perfcounter 查看当前JVM的Perf Counter信息
logger 查看和修改logger的level

类相关命令:用于查看和操作Java类

命令 功能说明
sc 查看JVM已加载的类信息
sm 查看已加载类的方法信息
jad 反编译指定已加载类的源码
mc 内存编译器,内存编译.java文件为.class文件
redefine 加载外部的.class文件,重定义JVM已加载的类
dump 把已加载类的byte code dump到特定目录
classloader 查看classloader的继承树,urls,类加载信息

增强命令:用于方法级别的监控和诊断(性能影响较大,谨慎使用)

命令 功能说明
monitor 方法执行监控
watch 方法执行数据观测
trace 方法内部调用路径,并输出方法路径上的每个节点上耗时
stack 输出当前方法被调用的调用路径
tt 方法执行数据的时空隧道,记录方法调用的参数和返回值

🎯 实用案例

💼 实战演练:下面通过几个真实案例,展示Arthas在实际问题排查中的强大应用!

📈 案例1:定位CPU使用率高的线程

🚨 问题场景:当系统CPU使用率突然飙高,可以使用thread命令来查找占用CPU较高的线程

🔍 操作步骤与示例

步骤1:执行命令

1
2
# 查看所有线程信息,按CPU使用率排序
thread -n 3

步骤2:分析输出

1
2
3
4
5
# 输出示例:
{% span red, "as-command-execute-daemon" Id=29 cpuUsage=75% RUNNABLE %}
at sun.management.ThreadImpl.dumpThreads0(Native Method)
at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440)
at com.taobao.arthas.core.command.monitor200.ThreadCommand$1.action(ThreadCommand.java:58)

分析结果:从输出可以看到,ID为29的线程占用了75%的CPU,并且可以查看到其堆栈信息,进而定位到具体的代码位置


🐌 案例2:排查应用响应慢的问题

⏱️ 问题场景:使用trace命令可以帮助定位方法调用中耗时较长的部分

🔍 操作步骤与示例

步骤1:执行跟踪命令

1
2
# 跟踪Web应用中的接口方法
trace com.example.controller.UserController getUserInfo

步骤2:分析方法调用耗时

1
2
3
4
5
# 输出示例:
`---[{% span red, 5.806737ms %}] com.example.controller.UserController:getUserInfo()
+---[{% span green, 0.123638ms %}] com.example.service.UserService:checkPermission() #24
+---[{% span red, 4.276622ms %}] com.example.service.UserService:getUserFromDb() #26
`---[{% span yellow, 1.373465ms %}] com.example.service.UserService:formatUserInfo() #28

分析结果:从输出可以清楚地看到,getUserFromDb()方法耗时最长,可能是数据库查询导致响应慢


🏗️ 案例3:查看类加载信息

🔍 问题场景:使用sc命令查看类的加载情况,有助于解决ClassNotFoundException等问题

🔍 操作步骤与示例

步骤1:查看类详细信息

1
2
# 查看指定类的详细信息
sc -d com.example.model.User

步骤2:分析类信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 输出示例:
{% span green, class-info %} com.example.model.User
{% span blue, code-source %} /app/classes/
{% span yellow, name %} com.example.model.User
{% span cyan, isInterface %} false
{% span gray, isAnnotation %} false
{% span red, isEnum %} false
{% span green, isAnonymousClass %} false
{% span blue, isArray %} false
{% span yellow, isLocalClass %} false
{% span cyan, isMemberClass %} false
{% span gray, isPrimitive %} false
{% span red, isSynthetic %} false
{% span green, simple-name %} User
{% span blue, modifier %} public
{% span yellow, annotation %}
{% span cyan, interfaces %}
{% span gray, super-class %} +-java.lang.Object
{% span red, class-loader %} +-sun.misc.Launcher$AppClassLoader@18b4aac2

分析结果:通过类信息可以确认类的加载路径、继承关系、类加载器等关键信息,帮助排查类加载问题


🔒 案例4:检查并修复线程死锁

💀 问题场景:使用thread -b命令可以检测系统中的死锁

🔍 操作步骤与示例

步骤1:检测死锁

1
2
# 查找死锁线程
thread -b

步骤2:分析死锁信息

1
2
3
# 输出示例:
{% span red, "Thread-1" Id=11 BLOCKED %} on java.lang.Object@33a17727 owned by {% span blue, "Thread-0" Id=10 %}
{% span blue, "Thread-0" Id=10 BLOCKED %} on java.lang.Object@5bb21b69 owned by {% span red, "Thread-1" Id=11 %}

分析结果:该输出显示Thread-0和Thread-1互相持有对方需要的锁,形成了死锁


👁️ 案例5:观察方法的入参和返回值

🔎 问题场景:使用watch命令可以观察方法的入参和返回值

🔍 操作步骤与示例

步骤1:监控方法调用

1
2
# 观察方法的入参和返回值
watch com.example.service.UserService getUserById "{params, returnObj}" -x 2

步骤2:分析方法执行结果

1
2
3
4
5
6
7
8
9
10
11
12
# 输出示例:
{% span blue, method %}=com.example.service.UserService.getUserById {% span green, location %}=AtExit
{% span cyan, ts %}=2020-02-13 19:42:12; [{% span red, cost %}=1.414993ms] {% span yellow, result %}=@ArrayList[
@Object[][
{% span green, @Integer[123] %},
],
@User[
{% span blue, id %}=@Integer[123],
{% span cyan, name %}=@String[Bob],
{% span yellow, age %}=@Integer[30],
],
]

应用价值:这对于调试和理解代码行为非常有用,可以实时查看方法的输入输出

🌐 Arthas Web Console

🖥️ 图形化界面:除了命令行交互外,Arthas还提供了Web Console界面,让诊断更加直观

访问方式:启动Arthas后,默认会启动一个HTTP服务器,访问http://127.0.0.1:8563/即可进入Web Console

提供友好的图形化界面

支持与命令行相同的功能

实时显示执行结果

支持命令历史记录

便于团队协作和问题排查


⚠️ 注意事项

安全提醒:使用Arthas时,请务必注意以下几点,确保系统安全和稳定运行

使用注意事项

生产环境使用

Arthas是一个诊断工具,不应该在生产环境随意使用

- 建议先在测试环境验证命令的影响 - 生产环境使用需要申请和审批 - 避免在高峰期进行诊断操作

性能影响

某些命令(如trace/watch/tt)可能会影响应用性能,请谨慎使用

- 增强命令会修改字节码,增加性能开销 - 长时间运行可能导致内存泄露 - 建议设置合理的采样频率和时间

类重置

增强的类在Arthas退出时会自动重置,也可以使用reset命令手动重置

- 定期检查和清理增强的类 - 异常退出时手动执行reset命令 - 避免长期保留增强状态

权限控制

在生产环境使用时,需要严格的权限控制和操作记录

- 限制可执行的命令范围 - 记录所有操作日志 - 建立操作审批流程

📝 总结

🎉 学习收获:通过本文的学习,您已经掌握了Arthas这个强大的Java诊断利器!

Arthas基础知识掌握度

常用命令熟练度

实战案例理解度

问题排查能力提升

🚀 持续学习:Arthas功能强大,建议在实际项目中多加练习,不断提升Java问题排查和性能调优能力。记住,熟练掌握Arthas是每个Java开发者的必备技能!

Arthas的简单使用
https://wl.do/posts/arthas.html
作者
Eliauk
发布于
2025-08-03
更新于
2025-08-03
许可协议
CC BY-NC-SA 4.0