一、什么是Arthas?
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
1.1 背景
通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。
开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。
如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。
Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。
1.2 Arthas能为我们做什么
Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从 JVM 内查找某个类的实例?
Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
二、部署Arthas
本篇文章 所使用的环境为 Linux操作系统, linux 系统和 windows系统安装都很简单。
2.1 Linux下部署
在命令行直接执行
#下载arthas jar 文件
curl -O https://arthas.aliyun.com/arthas-boot.jar
#运行jar文件
java -jar arthas-boot.jar
- 执行该程序的用户需要和目标进程具有相同的权限。比如以
admin用户来执行:sudo su admin && java -jar arthas-boot.jar或sudo -u admin -EH java -jar arthas-boot.jar。- 如果 attach 不上目标进程,可以查看
~/logs/arthas/目录下的日志。- 如果下载速度比较慢,可以使用 aliyun 的镜像:
java -jar arthas-boot.jar --repo-mirror aliyun --use-httpjava -jar arthas-boot.jar -h打印更多参数信息。
执行前需要 有 正在运行的Java程序,然后我们去选择监听那个服务
本次我为大家提供了基础的测试java服务jar文件,如若获取请 关注程序员Bug终结者公众号 回复 arthas 即可获取
先运行提供 的 java服务 jar文件:

然后另开一个窗口去运行 arthas java jar文件:

三、Arthas 基础命令
常用命令列表
- dashboard - 当前系统的实时数据面板
- getstatic - 查看类的静态属性
- heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
- jvm - 查看当前 JVM 的信息
- logger - 查看和修改 logger
- mbean - 查看 Mbean 的信息
- memory - 查看 JVM 的内存信息
- ognl - 执行 ognl 表达式
- perfcounter - 查看当前 JVM 的 Perf Counter 信息
- sysenv - 查看 JVM 的环境变量
- sysprop - 查看和修改 JVM 的系统属性
- thread - 查看当前 JVM 的线程堆栈信息
- vmoption - 查看和修改 JVM 里诊断相关的 option
- vmtool - 从 jvm 里查询对象,执行 forceG
3.1 查看当前系统的实时数据面板

分为三大模块
- thread模块
- 内存模块
- 实时运行信息模块
进行详细查看 主线程的 详细信息
thread 1

打印最繁忙的3个线程
thread -n 3

反编译 某个文件内的方法
jad com.chen.service.impl.ArthasServiceImpl thread
#还可以这么写
jad *ArthasServiceImpl thread

反编译后的代码带有 ClassLoader信息,加上 --source-only可以去除该信息
jad --source-only *ArthasServiceImpl thread

退出Arthas命令
stop

四、Arthas 项目命令实战

我们分为4部分来演示 在 项目过程中可能遇到的问题,来深入分析一下具体的问题,Arthas 可快速帮我们找出问题。
- thread 线程阻塞的演示,两个或者多个线程运行中,有某一个线程阻塞
- watch命令的演示,可以查看方法执行前后的具体信息,传入参数,以及返回的数据格式等信息
- cpu 飙升, 这种一般是 遇到了死循环或者高负荷执行某个耗时、需要大量的计算从而消耗计算机性能的代码
- method 方法响应慢,在前端页面调用接口过程中,某一个数据延时 5s甚至更多,应该对此优化接口返回,来提高用户体验
4.1 thread 线程阻塞

输入 命令查看阻塞信息
# 查看当前阻塞的线程
thread -b

反编译 指定方法

可以看到 这里进行 了 延时操作,线程休眠,修复,再次执行即可解决问题
4.2 watch命令演示
先运行该指令监听指定方法,然后再次运行,查看检测到的具体信息即可
watch *ArthasServiceImpl watch "{params,returnObj}" -x 2
成功监听 方法

运行指定方法查看详细信息

可以看到已成功返回信息

watch命令详解:
让你能方便的观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
atch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象
| 参数名称 | 参数说明 |
|---|---|
| class-pattern | 类名表达式匹配 |
| method-pattern | 函数名表达式匹配 |
| express | 观察表达式,默认值:{params, target, returnObj} |
| condition-express | 条件表达式 |
| [b] | 在函数调用之前观察 |
| [e] | 在函数异常之后观察 |
| [s] | 在函数返回之后观察 |
| [f] | 在函数结束之后(正常返回和异常返回)观察 |
| [E] | 开启正则表达式匹配,默认为通配符匹配 |
| [x:] | 指定输出结果的属性遍历深度,默认为 1,最大值是 4 |
[m <arg>] | 指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch <arg>]。 |
特别说明:
- watch 命令定义了 4 个观察事件点,即
-b函数调用前,-e函数异常后,-s函数返回后,-f函数结束后- 4 个观察事件点
-b、-e、-s默认关闭,-f默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出- 这里要注意
函数入参和函数出参的区别,有可能在中间被修改导致前后不一致,除了-b事件点params代表函数入参外,其余事件都代表函数出参- 当使用
-b时,由于观察事件点是在函数调用前,此时返回值或异常均不存在- 在 watch 命令的结果里,会打印出
location信息。location有三种可能值:AtEnter,AtExit,AtExceptionExit。对应函数入口,函数正常 return,函数抛出异常。
4.3 cpu飙升演示
thread
执行cpu命令后,会迅速沾满内存,执行 thread命令查看线程信息

cpu 飙升 100%,查看该线程详细信息
thread 1

反编译 cpu 方法代码分析具体问题
jad *ArthasServiceImpl cpu

发现是 代码中存在死循环,解决该问题,再次运行即可。
4.4 方法演示
trace *ArthasServiceImpl method
先运行以上监听命令,再运行 method方法,即可查看方法返回的具体信息,消耗时间等。

反编译method方法

可以查看出问题的代码进行修复即可。










![泛微E-office 10 schema_mysql接口敏感信息泄露漏洞复现 [附POC]](https://i-blog.csdnimg.cn/direct/0d5223b91d974acd94d6c91cb5a186c8.png)








