带着8个问题5分钟教你学会Arthas诊断工具

作者:微信小助手

发布时间:2021-08-12T09:29:33

前言

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

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

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

这 8 个问题,Arthas 官方文档(https://arthas.aliyun.com/doc)中并没有给出答案或标准的解决方案。

坑爹啊

这不是管杀不管埋吗!!!

管杀不管埋

正文

「下面是笔者结合多年使用 Arthas 的经验,针对这 8 个问题给出的详细解决方案,如果有疑问欢迎评论区指出。」

准备

先给出我的测试代码

package com.shockang.study;

import com.alibaba.fastjson.JSON;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.FieldDefaults;

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

public class ArthasDemo {
    public static void main(String[] args) {
        String s = "[{\"name\":\"zhangsan\",\"age\":\"10\",\"telephone\":\"123456\",\"interests\":[\"sing\",\"dance\",\"rap\"]},\n" +
                "{\"name\":\"lisi\",\"age\":\"20\",\"telephone\":\"123457\",\"interests\":[\"sing\",\"swim\"]},\n" +
                "{\"name\":\"wangwu\",\"age\":\"30\",\"telephone\":\"123458\",\"interests\":[\"sing\",\"program\"]}]";
        //模拟一遍遍的调用方法的过程
        for (; ; ) {
            System.out.println(new ArthasDemo().convert(s));
            try {
                TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private List<People> convert(String s) {
        return JSON.parseArray(s, People.class);
    }


    @Getter
    @Setter
    @ToString
    @FieldDefaults(level = AccessLevel.PRIVATE)
    private static class People {
        /**
         * 姓名
         */

        String name;
        /**
         * 年龄
         */

        String age;
        /**
         * 电话
         */

        String telephone;
        /**
         * 兴趣列表
         */

        List<String> interests;
    }
}

以下是控制台正常打印的结果

/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/bin/java ...
[ArthasDemo.People(name=zhangsan, age=10, telephone=123456, interests=[sing, dance, rap]), ArthasDemo.People(name=lisi, age=20, telephone=123457, interests=[sing, swim]), ArthasDemo.People(name=wangwu, age=30, telephone=123458, interests=[sing, program])]
[ArthasDemo.People(name=zhangsan, age=10, telephone=123456, interests=[sing, dance, rap]), ArthasDemo.People(name=lisi, age=20, telephone=123457, interests=[sing, swim]), ArthasDemo.People(name=wangwu, age=30, telephone=123458, interests=[sing, program])]

下载并运行 Arthas

按照下图中的步骤,选择一个 Java 进程进行 attach。

下载并运行Arthas

访问 WebConsole

attach 成功后可以打开谷歌浏览器输入http://127.0.0.1:3658/ 打开 WebConsole

(吐槽一句 Mac OS 的 Safari 浏览器不支持)

使用 WebConsole 最方便的是你可以打开多个标签页同时操作

问题 1:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

这个问题我经常在处理各种「依赖冲突」的时候遇到,有一些类的完全名称是一模一样,通过常规的办法无法解决类具体从哪个 jar 包加载。

别急,看我下面的解决办法。

  1. sc