Bootstrap

Arthas(阿尔萨斯)使用

Arthas(阿尔萨斯)使用

1、背景

当遇到 Java 线上问题时,如 CPU 飙升、负载突高、内存溢出等问题,可使用top,查命令,查网络,然后 jps、jstack、jmap、jhat、jstat、hprof ,这里主要介绍Arthas(阿尔萨斯)。

2、Arthas 介绍

Arthas 是Alibaba开源的Java诊断工具。安装在系统所在服务器。可以帮助开发人员或者运维人员查找问题,分析性能,bug追踪。

开源地址:https://github.com/alibaba/arthas
官方文档:https://alibaba.github.io/arthas
在这里插入图片描述

3、Arthas 使用场景

得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。下面仅仅列举几项常见的使用情况,更多的使用场景可以在熟悉了 Arthas 之后自行探索。

  1. 是否有一个全局视角来查看系统的运行状况?
  2. 有什么办法可以监控到 JVM 的实时运行状态?
  3. 为什么 CPU 又升高了,到底是哪里占用了 CPU ?
  4. 运行的多线程有死锁吗?有阻塞吗?
  5. 程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?
  6. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  7. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  8. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  9. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现?

4、 Arthas 如何使用

4.1 安装

安装的方式有好几种:

  1. 直接下载一个可以启动的jar包然后用java -jar的方式启动
  2. 用官方提供的as.sh脚本一键安装
  3. 用rpm的方式安装

本篇介绍第一种方式,因为它简单而且想迁移的时候也超级方便(毕竟只需要把下载的jar包拷贝走就行了)。
可以在官方 Github 上进行下载,有时打不开。
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
如果速度较慢,可以尝试国内的码云 Gitee 下载。
curl -O https://arthas.gitee.io/arthas-boot.jar
本文介绍在windows环境下如何使用arthas,linux下大同小异。
在浏览器中直接输入https://arthas.gitee.io/arthas-boot.jar,下载arthas-boot.jar包。
在这里插入图片描述

4.2 demo

在这里插入图片描述

在这里插入图片描述
本地运行程序,我这里随便写了一个查询人名的demo,同时启动一个线程,运行程序。

4.3 启动Arthas

打开cmd终端,切换到放arthas-boot.jar的路径,输入

java -jar arthas-boot.jar
1

然后显示第4个运行的进程就是我的demo。
在这里插入图片描述
然后输入2,点击enter,启动成功。
在这里插入图片描述
web console
Arthas 目前支持 Web Console,在成功启动连接进程之后就已经自动启动,可以直接访问 http://127.0.0.1:8563/ 访问,页面上的操作模式和控制台完全一样。
在这里插入图片描述
可以在以上两个页面执行命令操作。

4.4 用arthas解决常见问题

4.4.1 cpu占用过高

用thread命令列出线程的信息
在这里插入图片描述
这个命令会把所有线程按照cpu占用率从高到低列出来,如果线程太多,可以通过-n参数指定输出的行数。
在这里插入图片描述
面的输出结果可以看到id为某个数字的这个线程cpu占用率很过,然后再通过thread加线程id输出改线程的栈信息
在这里插入图片描述

4.4.2 死锁

还是用thread命令,参数是-b
在这里插入图片描述
这个命令和jstack工具检测死锁同样简单,不过个人认为jstack工具检测死锁其实要比这个更直观一些。

4.4.3 内存泄漏

这个我们可以用dashboard命令来动态查看内存情况,ctrl+c可以停止刷新
在这里插入图片描述
如果内存使用率在不断上升,而且gc后也不下降,后面还发现gc越来越频繁,很可能就是内存泄漏了。

这个时候我们可以直接用heapdump命令把内存快照dump出来,作用和jmap工具一样

heapdump --live G:/jvm.hprof
1

然后把得到的dump文件导入eclipse,用MAT插件分析就行了。
在这里插入图片描述

4.5其他命令

arthas还提供了很多用于监控的命令,比如监控某个方法的执行时间,反编译线上的class文件,甚至在不重启java应用的情况下直接替换某个类。

4.5.1 help命令

在arthas交互环境中,可以输入help命令,然后会出现所有arthas支持的命令
在这里插入图片描述

如果不知道命令的用法,可以输入相应的命令后加参数–help,比如可以看一下watch命令的用法
在这里插入图片描述
不仅会显示出命令是干嘛用的,命令的完整参数,还很贴心地提供了一些具体的例子,参考开源地址:https://github.com/alibaba/arthas。

4.5.2 dashboard命令

仪表盘显示当前进程相关信息。以上已介绍,分析内存的
在这里插入图片描述

4.5.3 thread命令(查看具体线程信息使用)

id 线程id
-n 指定最忙的的前n个线程并打印堆栈
b找出当前阻塞其他线程的线程
-i 指定cpu占比统计的采样时间间隔,单位为毫秒。

4.5.4 watch命令(查看类里某个方法的返回值和入参)

命令+类完全限定名+监测方法+表达式

watch com.example.arthas.arthasdemo.controller.HelloController getPerson "{params,returnObj}" -x 2
1

刷新页面,请求一次
在这里插入图片描述

在这里插入图片描述

4.5.5 trace命令(方法调用路径、耗时解析)

方法内部调用路径,并输出方法路径上的每个节点上耗时

trace com.example.arthas.arthasdemo.controller.HelloController getPerson
1

在这里插入图片描述
在这里插入图片描述

4.5.6 tt命令(时空隧道)

方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

tt -t com.example.arthas.arthasdemo.controller.HelloController getPerson
1

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

表格字段说明
表格字段        字段解释
INDEX       时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要。
TIMESTAMP   方法执行的本机时间,记录了这个时间片段所发生的本机时间
COST(ms)    方法执行的耗时
IS-RET      方法是否以正常返回的形式结束
IS-EXP      方法是否以抛异常的形式结束
OBJECT      执行对象的hashCode(),注意,曾经有人误认为是对象在JVM中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体
CLASS       执行的类名
METHOD      执行的方法名
12345678910

4.5.7 sc命令(查看JVM已加载的类信息)

sc -d com.example.arthas.arthasdemo.controller.HelloController
1

-d 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。
如果一个类被多个ClassLoader所加载,则会出现多次
在这里插入图片描述

4.5.8 退出arthas

quit —— 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
shutdown —— 关闭 Arthas 服务端,所有 Arthas 客户端全部退出 & 重置所有增强过的类,就不用单独调用reset

4.6远程连接

Arthas还提供 Web Console。
java -jar arthas-boot.jar --target-ip 192.168.168.67
在局域网内,其它机器可访问 http://192.168.168.67:8563
默认情况下,arthas只listen 127.0.0.1,所以如果想从远程连接,则可以使用 --target-ip参数指定listen的IP,更多参考-h的帮助说明。

;