Arthas的使用与进阶

Arthas使用与进阶

一、概述

Arthas是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

Arthas(阿尔萨斯)支持JDK6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的tab自动补全功能,进一步方便进行问题的定位和诊断。

二、快速安装

下载arthas-boot.jar,然后使用java -jar的方式启动。

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

windows下安装arthas

如图,我这里先进入F盘,新建一个文件夹,用来存放Arthas文件。

然后进入该目录,下载Arthas。

在这里插入图片描述

注意,在运行第二条命令之前,先运行一个java进程在内存中,不然会出现找不到java进程的错误。

打印帮助信息

java -jar arthas-boot.jar -h

如果下载速度比较慢,可以使用aliyun的镜像

java -jar arthas-boot.jar --repo-mirror aliyun --use-http

然后我们使用java -jar arthas-boot.jar运行Arthas。

在这里插入图片描述

这时Arthas会发现我们本地是没有Arthas的安装包的,这时会提示我们选择,这里我们选择2,1是我们在本地运行的Java进程。

选择2就会从网上去下载Arthas,从maven仓库中下载。

在这里插入图片描述

然后我们可以根据输出日志的文件存放路径,找到刚才下载的文件,我这里C:\Users\zal\.arthas\lib\3.6.6\arthas,是如图:

在这里插入图片描述

安装好之后会在C:\Users\zal该路径下生成两个文件夹,一个是.arthas,一个是logs,安装好的界面如图:

在这里插入图片描述

Linux下安装arthas

linux下安装arthas其实是和windows下安装的过程差不多。

首先下载jar包,使用命令curl -O https://arthas.aliyun.com/arthas-boot.jar

下载完成之后启动jar包,如图:

在这里插入图片描述

我们随便选择一个java进程之后,就会进入arthas的下载。

在这里插入图片描述

安装好的arthas文件会隐藏,所以我们使用ls -a来查看。

在这里插入图片描述

退出arthas

quit

卸载

在Linux/Unix/Mac平台

删除下面的文件

rm -rf ~/.arthas/
rm -rf ~/logs/arthas

Windows平台

直接删除user home下面的.arthaslogs/arthas目录即可。

在这里插入图片描述

小结

因为jar包是绿色的,要卸载的话,直接删除两个目录即可。

1、arthas安装目录

2、arthas的日志记录目录

三、快速入门:attach一个进程

目标:通过案例快速入门

  • 执行一个jar包
  • 通过arthas来attach
  • 进行几种常用的命令操作

步骤

1、准备

我们直接使用arthas安装好之后自带的jar包进行快速入门,如图。

math-game是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。

在这里插入图片描述

然后我们重新打开一个连接窗口,去进行使用arthas操作。

2、启动arthas

在这里插入图片描述

(1)如果粘附成功,在math-game.jar的那个窗口中会出现日志记录的信息。

(2)如果端口号被占用,也可以通过以下命令换成另一个端口号执行

java -jar arthas-boot.jar --telnet-port 9992 -http-port -1

我们也可以通过浏览器访问arthas,如图,访问该地址

在这里插入图片描述

访问127.0.0.1:3658,注意这里的ip地址是127.0.0.1,不是你的服务器ip或者是虚拟机ip。

在这里插入图片描述

我们也可以直接在浏览器中直接输入命令进行操作。

小结

  • 启动被诊断进程
  • 启动arthas-boot.jar,粘贴上面的进程
  • 不但可以通过命令行的方式来操作arthas,也可以通过浏览器来进行访问。

四、快速入门:常用命令接触

目标

  • dashboard仪表盘
  • 通过thread命令来获取到math-game进程的 Main Class
  • 通过jad来反编译Main Class
  • watch

命令介绍

1、dashboard仪表板

输入dashboard,按回车/enter ,会展示当前进程的信息,按ctrl + c可以中断执行。

注:输入前面部分的字母,按tab可以自动补全命令

  • 第一部分是显示JVM中运行的所有线程:所在线程组、优先级、线程状态、cpu占用率、是否是后台进程等
  • 第二部分显示的JVM内存的使用情况
  • 第三部分是操作系统的一些信息和Java版本号

在这里插入图片描述

q或者ctrl+c可以退出。

cls清屏

2、通过Thread命令来获取到arthas的进程的Main Class

使用命令Thread查看所有线程。

在这里插入图片描述

使用命令thread 1会打印线程ID为1的线程的栈,通常是Main函数的线程。

在这里插入图片描述

3、通过jad反编译Main Class

在这里插入图片描述

4、watch监视

通过watch命令来查看demo.MathGame#primeFactors函数的返回值:

q或者ctrl + c可以停止监视。

watch demo.MathGame primeFactors returnObj

在这里插入图片描述

5、退出arthas

如果只是退出当前的连接,可以使用quit或者exit命令,arthas到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出arthas,可以执行stop命令。

小结

在这里插入图片描述

五、基础命令

1、help

查看命令帮助信息

在这里插入图片描述

2、cat

打印文件内容,和linux中的cat命令类似

如果没有写路径,则显示当前目录下的文件

在这里插入图片描述

3、grep

匹配查找,和linux中的grep命令类似,但它只能用于管道命令。

在这里插入图片描述

只显示包含java字符串的行系统属性
sysprop | grep java

在这里插入图片描述

显示包含java字符串的行和行号的系统属性
sysprop | grep java -n

在这里插入图片描述

显示包含system字符串的10行信息
thread | grep system -m 10

在这里插入图片描述

使用正则表达式,显示包含2个o字符的线程信息
thread | grep -e "o+"

在这里插入图片描述

4、pwd

返回当前的工作目录

在这里插入图片描述

5、cls

清空当前屏幕区域

小结

在这里插入图片描述

6、session

查看当前会话的信息

在这里插入图片描述

7、reset

重置增强类,将被arthas增强过的类全部还原,arthas服务端关闭时会重置所有增强过的类。

还原指定类
reset Test
还原所有以List结尾的类
reset *List
还原所有的类
reset

在这里插入图片描述

8、version

输出当前目标Java进程所加载的Arthas版本号

9、history

打印历史命令

在这里插入图片描述

10、quit

退出当前arthas客户端,其它arthas客户端不受影响

11、stop

关闭arthas服务端,所有客户端全部退出

12、keymap

arthas快捷键列表以及自定义快捷键

在这里插入图片描述

13、arthas命令行快捷键

在这里插入图片描述

  • 任何时候的tab键,会根据当前的输入给出提示
  • 命令后敲 - 或 – ,然后按tab键,可以展示出此命令具体的选项

后台异步命令相关快捷键

  • ctrl + c 终止当前命令
  • ctrl + z 挂起当前命令,后续可以 bg/fg 重新支持此命令,或kill掉
  • ctrl + a 回到行首
  • ctrl + e 回到行尾

在这里插入图片描述

六、JVM相关命令

1、dashboard

显示当前系统的实时数据面板,按q或者ctrl + c退出

dashboard    Overview of target jvm's thread, memory, gc, vm, tomcat info.   

在这里插入图片描述

  • ID:Java级别的线程ID,注意这个ID不能跟jstack中的naviteID一一对应
  • NAME:线程名
  • GROUP:线程组名
  • PRIORITY:线程优先级,1-10之间的数字,越大表示优先级越高
  • STATE:线程的状态
  • CPU%:线程消耗的cpu占比,采样100ms,将所有的线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。
  • TIME:线程的运行总时间,数据格式为 分:秒
  • INTERRUPTED:线程当前的中断位状态
  • DAEMON:是否是daemon线程

2、Thread

查看当前JVM的线程堆栈信息

在这里插入图片描述

在这里插入图片描述

查看处于等待状态的线程

thread --state WAITING

在这里插入图片描述

3、jvm、sysprop

查看当前JVM的信息

在这里插入图片描述

线程相关

  • COUNT:JVM当前活跃的线程数
  • DAEMON-COUNT:JVM当前活跃的守护线程
  • PEAK-COUNT:从JVM启动开始曾经活着的最大线程数
  • STARED-COUT:从JVM启动开始总共启动过的线程次数
  • DEADLOCK-COUNT:JVM当前死锁的线程数

文件描述符相关

  • MAX-FILE-DESCRIPTOR-COUNT:JVM进程最大可以打开的文件描述符
  • OPEN-FILE-DESCRIPTOR-COUNT;JVM当前打开的文件描述符

4、sysprop

查看和修改JVM的系统属性

# 查看所有属性 
sysporp
查看单个属性,支持通过tab补全
sysporp java.version
修改单个属性
sysporp user.country
user.country=US

sysporp user.country CN

在这里插入图片描述

5、sysenv

查看当前JVM的环境属性(system environment variables)

查看所有环境变量
sysenv
查看单个环境变量
sysenv USER

6、vmoption

查看、更新VM诊断相关的参数

查看所有的选项
vmoption
查看指定的选项
vmoption PrintGCDetails
更新指定的选项
vmoption PrintGCDetails true

7、getstatic

通过getstatic命令可以方便的查看类的静态属性

getstatic 类名 属性名
显示demo.MathGame类中的静态属性random
getstatic demo.MathGame random

8、ognl

执行ognl表达式,,这是从3.0.5版本新增的功能

在这里插入图片描述

调用静态函数
ognl '@[email protected]("helloworld")'
获取静态类的静态字段
ognl '@demo.MathGame@random'
执行多行表达式,赋值给临时变量,返回一个list
ognl '#value1=@System@getProperty("java.home"),#value2=@System@getProperty("java.runtime.name"),{#value1,#value2}'

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/z318913/article/details/127955396