软件介绍
阿里巴巴Arthas是一款电脑监控诊断软件,该工具可以对JAVA代码进行性能分析,通过命令行来交互,开源免费使用,堪称神器,功能非常强大。
软件介绍
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。
Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
软件功能
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到JVM的实时运行状态?
基础命令
help——查看命令帮助信息
cls——清空当前屏幕区域
session——查看当前会话的信息
reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
version——输出当前目标 Java 进程所加载的 Arthas 版本号
history——打印命令历史
quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
keymap——Arthas快捷键列表及自定义快捷键
安装教程
阿里巴巴Arthas的安装流程是非常简单的,用户可以通过Java直接自动安装,不过如果安装过旧版的用户建议卸载原版本后重新手动安装,不过也相当简单,不过一些新手用户还是不会操作,所以下面小编就带来安装教程,让你轻松安装这款工具:
下载本业压缩包解压后,在文件夹里有arthas-boot.jar,直接用java -jar的方式启动:
java -jar arthas-boot.jar
打印帮助信息:
java -jar arthas-boot.jar -h
手动安装方法:
解压缩arthas的压缩包
unzip arthas-packaging-bin.zip
安装Arthas
安装之前最好把所有老版本的Arthas全都删掉
sudo su admin
rm -rf /home/admin/.arthas/lib/*
cd arthas
./install-local.sh
注意,这里根据你需要诊断的Java进程的所属用户进行切换
启动Arthas
启动之前,请确保老版本的Arthas已经shutdown.
./as.sh
使用指南
阿里巴巴Arthas的使用由命令行来输入,同样也使用命令行来交互沟通,所以对于命令的使用得当就能完美使用这款监控神器,下面小编就带来详细的阿里巴巴Arthas使用指南,让你全面了解命令使用的作用和功能:
常用命令
dashboard
当前系统的实时数据面板
参数解释
ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应
NAME: 线程名
GROUP: 线程组名
PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高
STATE: 线程的状态
CPU%: 线程消耗的cpu占比,采样100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。
TIME: 线程运行总时间
INTERRUPTE: 线程当前的中断位状态
thread
查看当前 JVM 的线程堆栈信息
参数说明
id
线程id
-n
指定最忙的前N个线程并打印堆栈
b
找出当前阻塞其他线程的线程
-i
指定cpu占比统计的采样间隔,单位为毫秒
PS: 这里的cpu统计的是,一段采样间隔内,当前JVM里各个线程所占用的cpu时间占总cpu时间的百分比。其计算方法为: 首先进行一次采样,获得所有线程的cpu的使用时间(调用的是java.lang.management.ThreadMXBean#getThreadCpuTime这个接口),然后睡眠一段时间,默认100ms,可以通过-i参数指定,然后再采样一次,最后得出这段时间内各个线程消耗的cpu时间情况,最后算出百分比。注意: 这个统计也会产生一定的开销(JDK这个接口本身开销比较大),因此会看到as的线程占用一定的百分比,为了降低统计自身的开销带来的影响,可以把采样间隔拉长一些,比如5000毫秒。
sc
参数说明
class-pattern
类名表达式匹配
-d
输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。如果一个类被多个ClassLoader所加载,则会出现多次
-E
开启正则表达式匹配,默认为通配符匹配
-f
输出当前类的成员变量信息(需要配合参数-d一起使用)
-x
指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出
PS: class-pattern支持全限定名,如com.test.AAA,也支持com/test/AAA这样的格式,这样,我们从异常堆栈里面把类名拷贝过来的时候,不需要在手动把/替换为.啦,
sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开options disable-sub-class true开关
sm
查看已加载类的方法信息
参数说明
class-pattern
类名表达式匹配
method-pattern
方法名表达式匹配
-d
展示每个方法的详细信息
-E
开启正则表达式匹配,默认为通配符匹配
PS:查看已加载类的方法信息, “Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。
sm 命令只能看到由当前类所声明 (declaring) 的方法,父类则无法看到
monitor
方法执行监控
参数说明
class-pattern
类名表达式匹配
method-pattern
方法名表达式匹配
-c
统计周期,默认值为120秒
监控项
timestamp 时间戳
class java类
method 方法(构造方法、普通方法)
total 调用次数
success 成功次数
fail 失败次数
rt 平均rt
fail-rate 失败率
PS:方法执行监控, 对匹配 class-pattern/method-pattern的类、方法的调用进行监控。
trace
方法内部调用路径,并输出方法路径上的每个节点上耗时
参数说明
class-pattern
类名表达式匹配
method-pattern
方法名表达式匹配
condition-express
条件表达式
-n
命令执行次数
#cost
方法执行耗时
PS: 很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果,例如trace *StringUtils isBlank '$cost>100’表示当执行时间超过100ms的时候,才会输出trace的结果。
stack
输出当前方法被调用的调用路径
输出当前方法被调用的调用路径, 很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。
参数说明
class-pattern
类名表达式匹配
method-pattern
方法名表达式匹配
condition-express
条件表达式
-n
执行次数限制
watch
方法执行数据观测
方法执行数据观测, 让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 groovy 表达式进行对应变量的查看。
参数说明
class-pattern
类名表达式匹配
method-pattern
方法名表达式匹配
express
观察表达式
condition-express
条件表达式
-b
在方法调用之前观察(默认关闭)
-e
在方法异常之后观察(默认关闭)
-s
在方法返回之后观察(默认关闭)
-f
在方法结束之后(正常返回和异常返回)观察 (默认开启)
-x
指定输出结果的属性遍历深度,默认为0
PS:这里重点要说明的是观察表达式,观察表达式的构成主要由 groovy 表达式组成,只要是一个合法的 groovy 表达式,都能被正常支持。
观察的维度也比较多,主要体现在参数 advice 的数据结构上。Advice 参数最主要是封装了通知节点的所有信息。
远程连接方法
1. 远程开启调试功能!
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8739
2. ide 开户远程 debug!
就ok 了!
接下来,就是debug时间,支持任意断点,包括启动时的断点;
另外,对于临时的代码改动,可以进行即时生效!
需要注意的是,在远程debug时,控制台的输出将是向远程输出,而非向本地输出!
更新内容
trace支持打印line number #668
增加mbean命令 #666
webconsole支持传递ip/port参数 #488
修复jobs系统,重定向 #695 #694
修复jad 反编绎lambda类出错的问题 #675
改进mc命令查找package/class的机制 #661
支持windows下中文目录 #574 #335
每次执行都保存commnad history #9
dashboard命令更好展示Runtime信息 #696
redefine命令打印redefine历史 #530
Upgrade netty to 4.1.36.Final #680
Upgrade termd to 1.1.7.4 #697
支持nobody用户启动 #572
jad命令支持method补全 #667
dump命令支持自动补全 #623
options命令支持自动补全 #612
在windows下支持诊断以service启动的进程 #581
修复命令为空时 tab自动补全 #564
升级可能会遇到的问题:
Agent jar file does not exist #700
网友评论