一、基本情况

1.1、背景

前面,我们介绍了jdk自带的jvisualvm等免费工具,以及商业化工具Jprofiler。
jvisualvm界面
image.png
JProfiler
image.png
这两款工具在业界知名度也比较高,他们的优点是可以图形界面上看到各维度的性能数据,使用者根据这些数据进行综合分析,然后判断哪里出现了性能问题。

但是这两款工具也有个缺点,都必须在服务端项目进程中配置相关的监控参数。然后工具通过远程连接到项目进程,获取相关的数据。这样就会带来一些不便, 比如线上环境的网络 是隔离的,本地的监控工具根本连不上线上环境。并且类似于Jprofiler这样的商业工具,是需要付费的。
那么有没有一款工具不需要远程连接,也不需要配置监控参数,同时也提供了丰富的性能监控数据呢?

今天跟大家介绍一款阿里巴巴开源的性能分析神器Arthas (阿尔萨斯)

1.2、概述

Arthas (阿尔萨斯)是Alibaba开源的Java诊断工具, 深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时 监控JVM状态。

Arthas支持JDK 6+,支持Linux/Mac/Windows, 采用命令行交互模式,同时提供丰富的Tab自动补全功能,进一-步方便进行问题的定位和诊断。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  • 这个类从哪个jar 包加载的?为什么会报各种类相关的Exception?
  • 我改的代码为什么没有执行到?难道是我没commit? 分支搞错了?
  • 遇到问题无法在线上debug,难道只能通过加日志再重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到JVM的实时运行状态?
  • 怎么快速定位应用的热点,生成火焰图?

1.3、基于哪些工具开发而来

  • greys-anatomy: Arthas 代码基于Greys二次开发而来,非常感谢Greys之前所有的工作,以及Greys原作者对Arthas提出的意见和建议!
  • termd: Arthas的命令行实现基于termd开发,是一款优秀的命令行程序开发框架,感谢termd提供了优秀的框架。
  • crash: Arthas的 文本渲染功能基于crash中的文本渲染功能开发,可以从这里看到源码,感谢crash在这方面所做的优秀工作。
  • cli: Arthas的命令行界面基于vert . x提供的cli库进行开发,感谢vert. x在这方面做的优秀工作。
  • compiler Arthas 里的内存编绎器代码来源
  • Apache Commons Net Arthas 里的Telnet Client代码来源
  • JavaAgent:运行在main方 法之前的拦截器,它内定的方法名叫premain ,也就是说先执行premain方法然后再执行main 方法
  • 码分析工具。ASM提供了与其他Java字节码框架类似的功能,但是主要关注性能。因为它被设计码分析工具。ASM提供了与其他Java字节码框架类似的功能,但是主要关注性能。因为它被设计码分析工具。ASM提供了与其他Java字节码框架类似的功能,但是主要关注性能。因为它被设计和实现得尽可能小和快,所以非常适合在动态系统中使用(当然也可以以静态方式使用,例如在编译器中)

    1.4、官方使用文档

    https://arthas.aliyun.com/zh-cn/

    二、安装与使用

    官方文档:https://arthas.aliyun.com/doc/download.html

    2.1、安装

    安装方式一: 可以直接在Linux上通过命令下载
    可以在官方Github 上进行下载,如果速度较慢,可以尝试国内的码云 Gitee下载。

  • github下载

  • Gitee下载

安装方式二:
也可以在浏览器直接访问https://alibaba.github.io/arthas/arthas-boot.jar,等待下载成功后,上传到Linux服务器上。
image.png
卸载:
在 Linux/Unix/Mac平台删除下面文件:
rm -rf ~l.arthas/
rm -rf ~/ logs/arthas
windows平台直接删除user home下面的.arthas和logs/arthas目录

2.2、工程目录

arthas-agent:基于JavaAgent技术的代理
bin:一些启动脚本
arthas-boot: Java版本的一键安装启动脚本
arthas-client: telnet client代码
arthas-common:一些共用的工具类和枚举类
arthas-core:核心库,各种arthas命令的交互和实现
arthas-demo:示例代码
arthas-memorycompiler:内存编绎器代码,Fork from
https://github.com/skalogs/skaETL/tree/master/compiler
arthas-packaging: maven打包相关的
arthas-site: arthas站点
arthas-spy:编织到目标类中的各个切面
static:静态资源
arthas-testcase:测试

2.3、启动

Arthas只是一个java程序,所以可以直接用java -jar运行。
执行成功后,arthas提供了一种命令行方式的交互方式,arthas会检测当前服务器上的Java进程,并将进程列表展示出来,用户输入对应的编号(1、2、3、4…)进行选择,然后回车。

比如:方式1:
java -jar arthas-boot.jar
# 选择进程(输入[]内编号(不是PID)回车)
[ INFO] arthas-boot version: 3.1.4
[INF0] Found existing java process,please choose one and hit RETURN.
* [1]:11616 com.Arthas
[2]:8676
[3]:16200 org.jetbrains.jps.cmdline.Launcher
[4]: 21032 org.jetbrains.idea.maven.server.RemoteMavenServer

方式2:
运行时选择Java 进程PID
java -jar arthas-boot.jar [PID]

image.png

2.4、查看进程

2.5、查看日志

cat ~/logs/arthas/arthas.log

2.6、查看帮助

java -jar arthas-boot.jar -h

2.7、web console

除了在命令行查看外,Arthas目前还支持 web Console。在成功启动连接进程之后就已经自动启动,可以直接访问http://127.0.0.1:8563/访问,页面上的操作模式和控制台完全一样。
image.png

2.8、退出

最后一行[arthas@7457]$,说明打开进入了监控客户端,在这里就可以执行相关命令进行查看了。

  • 使用quit\exit:退出当前客户端
  • ·使用stop\shutdown:关闭arthas服务端,并退出所有客户端。

    三、相关诊断指令

    3.1、基础指令

    help—查看命令帮助信息
    cat—打印文件内容,和linux里的cat命令类似
    echo—打印参数,和linux里的echo命令类似
    grep—匹配查找,和linux里的grep命令类似
    tee—复制标准输入到标准输出和指定的文件,和linux里的tee命令类似
    pwd—返回当前的工作目录,和linux命令类似
    cls――清空当前屏幕区域
    session――查看当前会话的信息
    reset—-重置增强类,将被Arthas增强过的类全部还原,Arthas服务端关闭时会重置所有增强过的类
    version—―输出当前目标Java进程所加载的Arthas版本号
    history——打印命令历史
    quit—-退出当前Arthas客户端,其他Arthas客户端不受影响
    stop—―关闭Arthas服务端,所有Arthas客户端全部退出
    keymap——Arthas快捷键列表及自定义快捷键

    3.2、jvm相关

    image.png

    dashboard

    dashboard -i 1000 -n 4
    表示一秒刷新一次,刷新四次

    thread

    jvm

    3.3、class/classloader相关

    image.png

    sc

    sc命令:查看JVM已加载的类信息

  • https://arthas.aliyun.com/doc/sc

  • 常用参数:
    • class-pattern类名表达式匹配
    • -d 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。如果一个类被多个ClassLoader所加载,则会出现多次
    • -E 开启正则表达式匹配,默认为通配符匹配
    • -f 输出当前类的成员变量信息(需要配合参数-d一起使用)
    • -x 指定输出静态变量时属性的遍历深度,默认为0,即直接使用toString输出
  • 补充:

      1. class-pattern支持全限定名,如com.test.AAA,也支持com/test/AAA这样的格式,这样,我们从异常堆栈里面把类名拷贝过来的时候,不需要在手动把/替换为.了。
      1. sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开options disable-sub-class true开关

        sm

        sm命令:查看已加载类的方法信息
  • https://arthas.aliyun.com/doc/sm

  • sm命令只能看到由当前类所声明(declaring)的方法,父类则无法看到。
  • 常用参数:

    • class-pattern 类名表达式匹配
    • method-pattern 方法名表达式匹配
    • -d 展示每个方法的详细信息
    • -E 开启正则表达式匹配,默认为通配符匹配

      jad

      jad命令:反编译指定己加载类的源码
  • https://arthas.aliyun.com/doc/jad

  • 在Arthas Console 上,反编译出来的源码是带语法高亮的,阅读更方便
  • 当然,反编译出来的 java 代码可能会存在语法错误,但不影响你进行阅读理解
  • 编译java.lang.String

image.png

mc、redefine

image.png

classloader

classloader命令:查看classloader的继承树,urls,类加载信息.

  • https://arthas.aliyun. com/doc/classloader
  • 了解当前系统中有多少类加载器,以及每个加载器加载的类数量,帮助您判断是否有类加载器泄漏。
  • 常用参数:
    • -t:查看classLoader的继承树
    • -l :按类加载实例查看统计信息
    • -c :用classloader对应的hashcode来查看对应的jar urls

image.png

3.4、monitor/watch/trace相关

image.png

monitor

monitor命令:方法执行监控

  • 对匹配class-pattern / method-pattern的类、方法的调用进行监控。涉及方法的调用次数、执行时间、失败率等
  • https://arthas.aliyun.com/doc/monitor
  • monitor 命令是一个非实时返回命令
  • 常用参数:
    • class-pattern类名表达式匹配
    • method-pattern方法名表达式匹配
    • -c 统计周期,默认值为120秒
  • 监控项

image.png

  • 参数说明

image.png

watch

trace

stack

tt

3.5、其它

profiler/火焰图

options