一、基本情况
1.1、背景
前面,我们介绍了jdk自带的jvisualvm等免费工具,以及商业化工具Jprofiler。
jvisualvm界面
JProfiler
这两款工具在业界知名度也比较高,他们的优点是可以图形界面上看到各维度的性能数据,使用者根据这些数据进行综合分析,然后判断哪里出现了性能问题。
但是这两款工具也有个缺点,都必须在服务端项目进程中配置相关的监控参数。然后工具通过远程连接到项目进程,获取相关的数据。这样就会带来一些不便, 比如线上环境的网络 是隔离的,本地的监控工具根本连不上线上环境。并且类似于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下载
- wget https://arthas.gitee.io/ arthas-boot.jar
安装方式二:
也可以在浏览器直接访问https://alibaba.github.io/arthas/arthas-boot.jar,等待下载成功后,上传到Linux服务器上。
卸载:
在 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]
2.4、查看进程
2.5、查看日志
2.6、查看帮助
2.7、web console
除了在命令行查看外,Arthas目前还支持 web Console。在成功启动连接进程之后就已经自动启动,可以直接访问http://127.0.0.1:8563/访问,页面上的操作模式和控制台完全一样。
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相关
dashboard
dashboard -i 1000 -n 4
表示一秒刷新一次,刷新四次thread
jvm
3.3、class/classloader相关
sc
sc命令:查看JVM已加载的类信息
- 常用参数:
- class-pattern类名表达式匹配
- -d 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。如果一个类被多个ClassLoader所加载,则会出现多次
- -E 开启正则表达式匹配,默认为通配符匹配
- -f 输出当前类的成员变量信息(需要配合参数-d一起使用)
- -x 指定输出静态变量时属性的遍历深度,默认为0,即直接使用toString输出
补充:
- sm命令只能看到由当前类所声明(declaring)的方法,父类则无法看到。
常用参数:
- 在Arthas Console 上,反编译出来的源码是带语法高亮的,阅读更方便
- 当然,反编译出来的 java 代码可能会存在语法错误,但不影响你进行阅读理解
- 编译java.lang.String
mc、redefine
classloader
classloader命令:查看classloader的继承树,urls,类加载信息.
- https://arthas.aliyun. com/doc/classloader
- 了解当前系统中有多少类加载器,以及每个加载器加载的类数量,帮助您判断是否有类加载器泄漏。
- 常用参数:
- -t:查看classLoader的继承树
- -l :按类加载实例查看统计信息
- -c :用classloader对应的hashcode来查看对应的jar urls
3.4、monitor/watch/trace相关
monitor
monitor命令:方法执行监控
- 对匹配class-pattern / method-pattern的类、方法的调用进行监控。涉及方法的调用次数、执行时间、失败率等
- https://arthas.aliyun.com/doc/monitor
- monitor 命令是一个非实时返回命令
- 常用参数:
- class-pattern类名表达式匹配
- method-pattern方法名表达式匹配
- -c 统计周期,默认值为120秒
- 监控项
- 参数说明