ARTHAS-诊断工具的安装与使用

一、安装、启动

安装包下载地址https://github.com/alibaba/arthas/releases/download/arthas-all-3.6.0/arthas-bin.zip

unzip arthas-bin.zip

/**
** 默认telnet 端口 3568 ,http 8563,因端口冲突顾修改 ,target-ip 物理机IP,用于访问。
** 输入进程序列号,启动成功后服务在单独的一个session进程中,在此进程中执行arthas相关命令,
** quit或exit可退出session会话,完全退出执行stop
**/
java -jar arthas-boot.jar --telnet-port 3569 --http-port 8564 --target-ip 192.168.1.170

退出session回话后重新进入session回话

java -jar arthas-client.jar 192.168.1.170 3569

访问地址:http://192.168.1.170:8564/

arthas 修改java 配置 arthas默认端口_方法名

二、应用

参考地址:https://arthas.gitee.io/commands.html

1、基础命令
help——查看命令帮助信息
cat——打印文件内容,和linux里的cat命令类似
pwd——返回当前的工作目录,和linux命令类似
cls——清空当前屏幕区域
session——查看当前会话的信息
reset——重置增强类,watch/trace 等命令时,实际上是修改了应用的字节码,插入增强的代码。显式执行 reset 命令,可以清除掉这些增强代码
version——输出当前目标 Java 进程所加载的 Arthas 版本号
history——打印命令历史
quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
keymap——Arthas快捷键列表及自定义快捷键

2、dashboard 控制面板

展示当前进程的详细信息,CTRL+C退出屏幕滚动
[arthas@125550]$ dashboard

arthas 修改java 配置 arthas默认端口_arthas 修改java 配置_02

3、thread
当前线程总的数量以及各个线程的状态体现,单个线程的名称,分组,优先级,状态,CPU的负载率 以及是否是守护线程。

所有线程的id、名称、状态、占用cpu这些信息

thread

查看线程堆栈信息

thread id

查看 CPU 使用率 top n 的线程的栈

thread -n

5 s 内线程信息

thread -i 5000

5s内最忙的n个线程栈

thread -n 3 -i 5000

是否有阻塞(即WATTING状态)

thread -b

线程状态 WATTING 、 RUNNABLE、TIMED_WAIT

thread --state WATTING

4、jvm

JVM详细信息

jvm

查看jvm内存信息

memory

5、jad

反编译可以拿到当前类在具体系统中的classload信息

反编译类,类路径.类名称

jad java.lang.String

反编译指定方法 jad 类路径.类名称 方法名

jad com.xindun.datasync.service.DevLogAndroidService consumerMessage

6、sysprop

查看进程的环境变量

查看所有应用环境变量

sysprop

修改环境变量 --> sysprop 环境变量名称 环境变量值

sysprop max_idle 201

系统环境变量

sysenv

7、sc
展示JVM已加载的类信息

sc -d 类路径.类名称

sc -d com.xindun.datasync.service.DevLogAndroidService

8、ognl表达式

1、只查看第一个输入参数 "params[0]" ;

2、查看第一个参数的size "params[0].size()";

3、结果按name属性投影 "params[0].{ #this.name }";

4、按条件过滤 "params[0].{? #this.name == null }" ;

5、判断字符串相等'params[0]=="xyz"';

6、判断long型相等 'params[0]==123456789L'

monitor/watch/trace/stack/tt 类路径.类名 方法名 表达式

查看登录接口参数,用户为xindun账号的登录入参和响应参数

watch com.xindun.auth.controller.LoginController login "{params,returnObj}" -x 2 'params[2]=="xindun"'

9、monitor
对匹配的类或者方法调用进行监控,监控维度包含 调用总次数,成功次数,失败次数,平均 RT,失败率

monitor -c 周期(单位秒) 类路径.类名 方法名

monitor -c 5 com.xindun.mq.redis.RedisServiceUtil rpop

arthas 修改java 配置 arthas默认端口_环境变量_03

10、watch
方法执行数据观测,可查看出、入参数。
AtEnter、AtExit、AtExceptionExit 对应函数入口、函数正常return、函数抛出异常。

监控接口执行过程

watch 类路径.类名 方法名(可*匹配) -x 2

/**

  • -x [n] n表示参数展示的深度
  • -n [m] m表示次数
  • '{params,returnObj,throwExp}' 打印输入、输出、异常信息,不输入该选项展示全部信息
  • -b、-e、-s、-f 观察点,分别是方法调用前、方法异常后、方法返回后、方法结束后(调用方法前不可使用-s、-f)
  • '#cost > 2000' 表示耗时超过2秒条件
  • -v 打印Condition express的具体值和执行结果,方便确认
    **/
    watch com.xindun.auth.controller.LoginController * -x 2

只捕获异常的请求

watch 类路径.类名 方法名(可*匹配) -e

watch com.xindun.auth.controller.LoginController * -e

arthas 修改java 配置 arthas默认端口_环境变量_04

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

trace 类路径.类名 方法名(可*匹配)

/**

  • -x [n] n表示参数展示的深度
  • -n [m] m表示次数
  • '#cost > 2000' 表示耗时超过2秒条件
  • 打印内容中的 “#数字” 代表代码所在行数
    **/
    trace com.xindun.auth.controller.LoginController *

arthas 修改java 配置 arthas默认端口_环境变量_05

12、stack
输出当前方法被调用的调用路径

类路径.类名 方法名(可*匹配)

/**

  • 默认一直监控,可添加执行次数 -n 5(监控5次)
  • 方法后可增加过滤条件,如耗时>2秒 '#cost > 2000'
    **/
    stack com.xindun.auth.service.ManagerService getManagerByUsername

arthas 修改java 配置 arthas默认端口_类名_06

13、tt

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

tt -t 类路径.类名 方法名(可*匹配)

/**

  • 默认一直监控,可添加执行次数 -n 5(监控5次)
  • 方法后可增加过滤条件,如耗时>2秒 '#cost > 2000'
    **/
    tt -t com.xindun.auth.controller.LoginController login

打印出了index这次执行入参和相应结果信息

tt -i

target 目标对象、params 入参、returnObj 出参、throwExp 异常

打印出了index这次执行的目标对象(target)的getLogo的结果

tt -i -w "target.getLogo()" -x 2

arthas 修改java 配置 arthas默认端口_方法名_07

INDEX时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要。
TIMESTAMP方法执行的本机时间,记录了这个时间片段所发生的本机时间
COST(ms)方法执行的耗时
IS-RET方法是否以正常返回的形式结束
IS-EXP方法是否以抛异常的形式结束
OBJECT执行对象的hashCode()
CLASS执行的类名
METHOD执行的方法名

14、profiler 火焰图

启动火焰图

profiler start

状态

profiler status

停止并输出html文件

profiler stop --format html

arthas 修改java 配置 arthas默认端口_arthas 修改java 配置_08

点开性能损耗严重的地方可以看放大的详情图

arthas 修改java 配置 arthas默认端口_环境变量_09

15、heapdump

dump 到指定文件

heapdump /home/xindun/arthas/dump.hprof

只包含活跃对象

heapdump --live /home/xindun/arthas/dump.hprof

16、logger

获取hash classloader值

logger --name com.xindun.auth.controller.LoginController

修改指定类的日志级别

logger --name 类路径.类名 --level 日志级别(trace > debug > info > warn> error) -c 类hash值

logger --name com.xindun.auth.controller.LoginController --level info -c 731e0988

三、IDEA集成ARTHAS

1、安装插件

File->setting->plugins, 搜索 “arthas”,安装重启。

安装好插件后,在方法上右击,会出现如下弹窗,点击右边的watch,trace等会提示命令已经复制到粘贴板

arthas 修改java 配置 arthas默认端口_方法名_10