• 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
    
    • 1
    • 2

    windows下安装arthas

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

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

    在这里插入图片描述

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

    打印帮助信息

    java -jar arthas-boot.jar -h
    
    • 1

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

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

    然后我们使用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
    
    • 1

    卸载

    在Linux/Unix/Mac平台

    删除下面的文件

    rm -rf ~/.arthas/
    rm -rf ~/logs/arthas
    
    • 1
    • 2

    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
    
    • 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
    
    • 1

    在这里插入图片描述

    5、退出arthas

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

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

    小结

    在这里插入图片描述

    五、基础命令

    1、help

    查看命令帮助信息

    在这里插入图片描述

    2、cat

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

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

    在这里插入图片描述

    3、grep

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    4、pwd

    返回当前的工作目录

    在这里插入图片描述

    5、cls

    清空当前屏幕区域

    小结

    在这里插入图片描述

    6、session

    查看当前会话的信息

    在这里插入图片描述

    7、reset

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

    还原指定类
    reset Test
    还原所有以List结尾的类
    reset *List
    还原所有的类
    reset
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    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.   
    
    • 1

    在这里插入图片描述

    • 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
    
    • 1
    • 2
    • 3
    • 4
    修改单个属性
    sysporp user.country
    user.country=US
    
    sysporp user.country CN
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    5、sysenv

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

    查看所有环境变量
    sysenv
    查看单个环境变量
    sysenv USER
    
    • 1
    • 2
    • 3
    • 4

    6、vmoption

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

    查看所有的选项
    vmoption
    查看指定的选项
    vmoption PrintGCDetails
    
    • 1
    • 2
    • 3
    • 4
    更新指定的选项
    vmoption PrintGCDetails true
    
    • 1
    • 2

    7、getstatic

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

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

    8、ognl

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

    在这里插入图片描述

    调用静态函数
    ognl '@java.lang.System@out.println("helloworld")'
    获取静态类的静态字段
    ognl '@demo.MathGame@random'
    执行多行表达式,赋值给临时变量,返回一个list
    ognl '#value1=@System@getProperty("java.home"),#value2=@System@getProperty("java.runtime.name"),{#value1,#value2}'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    Vue 获取/设置指定组件高度
    Opencv图像基本操作——读取、显示、截取图像、属性、颜色通道、边界填充、图像融合
    选择低代码开发,我轻松了不少!
    说明白正反向代理,以及Nginx和Gunicorn
    516TX 336A4940DNP516TX 具有用于联网工业以太网协议
    Axure 9 实战案例,动态面板的应用 6,导航菜单栏的手风琴效果
    gin框架39--重构 BasicAuth 中间件
    6.3物联网RK3399项目开发实录-驱动开发之I2C 使用(wulianjishu666)
    面向对象编程
    提高 K8S 容器运行时的可观察性最佳方法之一
  • 原文地址:https://blog.csdn.net/z318913/article/details/127955396