Arthas -- 线上故障排查工具

目录

一、概述

1、解决问题

2、运行环境要求

二、Arthas安装

1、快速安装

①Windows环境安装

​②Linux环境安装

2、从Maven仓库下载全量包

3、卸载

①Windows环境卸载

②Linux环境卸载

三、入门操作

1、demo代码 

2、 启动demo

3、 启动arthas

 4、通过浏览器连接 arthas

四、常用命令

1、dashboard 仪表板

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

3、通过 jad 来反编译 Main Class

4、watch监视

 5、退出arthas

五、常用系统命令

六、JVM相关命令 

1、dashboard 仪表板

①作用

②效果

2、thread线程相关

①作用

② 举例

3、JVM

①作用

②效果

4、 sysprop

①作用

②举例

5、sysenv

①作用

②举例

6、vmoption

①作用

②举例

7、 getstatic

①作用

②语法

③举例

8、ognl

①作用

②语法

③参数说明

④举例

 七、class/classloader相关命令

1、sc

①作用

②参数说明

③举例

2、sm 

①作用

②参数说明

③举例

3、jad

①作用

②参数说明 

③举例

4、mc

①作用

②举例

5、redefine

①作用

②redefine 的限制

③结合 jad/mc 命令使用 

八、高级命令

1、dump

①作用

②参数说明

③举例

2、classloader

①目标

②作用

 ③参数说明

④举例

 ⑤总结

3、monitor

①目标

②作用

③参数说明

④举例

⑤总结

4、watch 

①作用

②参数说明

③举例

5、trace 

②参数说明

③举例 

 6、stack

①作用 

②参数说明 

 ③举例

7、tt

①作用

②参数说明

③举例

8、options

①作用

②全局选项

③举例

9、profiler 火焰图

①介绍

② 举例

③火焰图的含义


一、概述

Arthas是Alibaba开源的Java诊断工具。

官方文档:https://alibaba.github.io/arthas
Arthas 脑图—常用命令汇总: https://github.com/alibaba/arthas/issues/1003


1、解决问题

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?

2、运行环境要求

        Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。


二、Arthas安装

1、快速安装

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

curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

注:运行第二条代码前,即启动arthas的jar包前,需要先运行java进程在内存中,不然arthas将找不到正在运行的java程序,进而报错。

下载速度慢,可尝试阿里云镜像:

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

①Windows环境安装

1、在Windows命令窗口下,使用安装curl命令下载jar包(找一个你找得到的文件夹里安装)

2、使用java启动arthas-boot.jar安装arthas,运行后会让你选择正在跑的Java进程,选择你需要监控的进程回车。

②Linux环境安装

        与Windows安装方式一致,需要注意的是:Linux安装的目录是隐藏路径,需要ls -a查看所有文件夹才可以看到.arthas文件。


2、从Maven仓库下载全量包

①阿里云镜像仓库下载

https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/3.1.7/arthas-packaging-3.1.7-bin.zip

        解压后,文件夹内有arthas-boot.jar文件,直接java -jar方式启动即可。

注:Linux环境下的解压,解压到指定arthas目录

unzip -d arthas arthas-packaging-3.1.7-bin.zip

3、卸载

        因为jar包是绿色安装,直接删除两个目录即可。

①Windows环境卸载

        直接删除安装位置的 .arthas 和 logs/arthas 目录

②Linux环境卸载

        删除以下文件

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

三、入门操作

执行一个jar包

通过arthas来粘附,并且进行几种常用的操作

通过一个案例快速入门

1、demo代码 

        以下是一个简单的Java程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。代码 的内容不用理会这不是现在关注的点。

package demo;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;

public class MathGame {
    private static Random random = new Random();
    //用于统计生成的不合法变量的个数
    public int illegalArgumentCount = 0;

    public static void main(String[] args) throws InterruptedException {
        MathGame game = new MathGame();
        //死循环,每过 1 秒调用 1 次下面的方法(不是开启一个线程)
        while (true) {
            game.run();
            TimeUnit.SECONDS.sleep(1);
        }
    }

    //分解质因数
    public void run() throws InterruptedException {
        try {
            //随机生成 1 万以内的整数
            int number = random.nextInt() / 10000;
            //调用方法进行质因数分解
            List<Integer> primeFactors = primeFactors(number);
            //打印结果
            print(number, primeFactors);
        } catch (Exception e) {
            System.out.println(String.format("illegalArgumentCount:%3d, ",
                    illegalArgumentCount) + e.getMessage());
        }
    }

    //打印质因数分解的结果
    public static void print(int number, List<Integer> primeFactors) {
        StringBuffer sb = new StringBuffer(number + "=");
        for (int factor : primeFactors) {
            sb.append(factor).append('*');
        }
        if (sb.charAt(sb.length() - 1) == '*') {
            sb.deleteCharAt(sb.length() - 1);
        }
        System.out.println(sb);
    }

    //计算number的质因数分解
    public List<Integer> primeFactors(int number) {
        //如果小于 2 ,则抛出异常,并且计数加 1
        if (number < 2) {
            illegalArgumentCount++;
            throw new IllegalArgumentException("number is: " + number + ", need >=
                    2");
        }
        //用于保存每个质数
        List<Integer> result = new ArrayList<Integer>();
        //分解过程,从 2 开始看能不能整除
        int i = 2;
        while (i <= number) { //如果i大于number就退出循环
            //能整除,则i为一个因数,number为整除的结果再继续从 2 开始
            if (number % i == 0) {
                result.add(i);
                number = number / i;
                i = 2;
            } else {
                i++; //否则i++
            }
        }
        return result;
    }
}

2、 启动demo

#下载已经打包好的arthas-demo.jar
curl -O https://alibaba.github.io/arthas/arthas-demo.jar

#在命令行下执行
java -jar arthas-demo.jar


3、 启动arthas

1、因为arthas-demo.jar进程打开了一个窗口,所以另开一个命令窗口执行arthas-boot.jar

2、选择要粘附的进程:arthas-demo.jar

3、如果粘附成功,在arthas-demo.jar那个窗口中会出现日志记录的信息,记录在c:\Users\Administrator\logs目录下

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

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

 4、通过浏览器连接 arthas

        Arthas目前支持Web Console,用户在attach成功之后,可以直接访问:http://127.0.0.1:3658/。可以填入IP,远程连接其它机器上的arthas。


四、常用命令

1、dashboard 仪表板

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

第一部分是显示JVM中运行的所有线程:所在线程组,优先级,线程的状态,CPU的占用率,是否是后台进程等

第二部分显示的JVM内存的使用情况

第三部分是操作系统的一些信息和Java版本号


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

         获取到arthas-demo进程的Main Class

        thread 1会打印线程ID 1的栈,通常是main函数的线程


3、通过 jad 来反编译 Main Class

        jad可以通过反编译java的class文件,将其编译成源代码。线上监测错误,手上没有源码的时候很有帮助

jad 包名.类名

 


4、watch监视

        可以监视程序在执行过程中,输入参数是什么,返回值是什么。

watch demo.MathGame primeFactors returnObj

watch demo.MathGame(监视的包名和类名) primeFactors(监视的方法) returnObj(监视的返回值)


 5、退出arthas

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

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


五、常用系统命令

1、help 查看命令帮助信息

2、cat 打印文件内容,和linux里的cat命令类似 注:汉字有乱码的问题 如果没有写路径,则显示当前目录下的文件

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

参数列表 作用
-n 显示行号
-i 忽略大小写查找
-m 行数 最大显示行数,要与查询字符串一起使用
-e "正则表达式" 使用正则表达式查找

4、pwd 返回当前的工作目录,和linux命令类似

5、cls 清空当前屏幕区域

6、session 查看当前会话的信息

7、reset 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类

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

9、history 打印命令历史

10、quit 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响

11、stop 关闭 Arthas 服务端,所有 Arthas 客户端全部退出

12、keymap Arthas快捷键列表及自定义快捷键

快捷键说明 命令说明
ctrl + a 跳到行首
ctrl + e 跳到行尾
ctrl + f 向前移动一个单词
ctrl + b 向后移动一个单词
键盘左方向键 光标向前移动一个字符
键盘右方向键 光标向后移动一个字符
键盘下方向键 下翻显示下一个命令
键盘上方向键 上翻显示上一个命令
ctrl + h 向后删除一个字符
ctrl + shift + / 向后删除一个字符
ctrl + u 撤销上一个命令,相当于清空当前行
ctrl + d 删除当前光标所在字符
ctrl + k 删除当前光标到行尾的所有字符
ctrl + i 自动补全,相当于敲TAB
ctrl + j 结束当前行,相当于敲回车
ctrl + m 结束当前行,相当于敲回车

六、JVM相关命令 

1、dashboard 仪表板

①作用

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

②效果

数据说明:

ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应

NAME:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值