Arthas 排查JVM问题总结

一、安装

在Arthas官网:https://arthas.aliyun.com/中下载安装包。

执行java -jar arthas-boot.jar就可以启动。

二、常见命令

  • dashboard:查看JVM全局概览,包括线程、堆内存、GC还有系统信息等
  • thread:常见命令,查看线程。通过thread 查看线程详情信息。

通过thread -b查看阻塞线程信息。

  • jad:反编译命令,能够将class文件反编译回源码。可以用在生产环境比较版本是否更新。
  • watch:查看方法参数

  • trace:查看方法内部调用路径,可以看到每条路径的耗时

  • stack:查看方法调用路径

  • redefine:将编译好的class热部署到环境

  • ognl:可以查看类中属性和方法执行情况。

三、实践

示例代码:

复制代码
public class Arthas {

    private static HashSet hashSet = new HashSet();

    public String getName() {
        return "arthas";
    }

    public static void main(String[] args) {
        // 模拟 CPU 过高
        cpuHigh();
        // 模拟线程死锁
        deadThread();
        // 不断的向 hashSet 集合增加数据
        addHashSetThread();
    }

    /**
     * 不断的向 hashSet 集合添加数据
     */
    public static void addHashSetThread() {
        // 初始化常量
        new Thread(() -> {
            int count = 0;
            while (true) {
                try {
                    hashSet.add("count" + count);
                    Thread.sleep(1000);
                    count++;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"my-arthas-thread").start();
    }

    public static void cpuHigh() {
        new Thread(() -> {
            while (true) {

            }
        },"my-arthas-thread1").start();
    }

    /**
     * 死锁
     */
    private static void deadThread() {
        /** 创建资源 */
        Object resourceA = new Object();
        Object resourceB = new Object();
        // 创建线程
        Thread threadA = new Thread(() -> {
            synchronized (resourceA) {
                System.out.println(Thread.currentThread() + " get ResourceA");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resourceB");
                synchronized (resourceB) {
                    System.out.println(Thread.currentThread() + " get resourceB");
                }
            }
        },"my-arthas-thread2");

        Thread threadB = new Thread(() -> {
            synchronized (resourceB) {
                System.out.println(Thread.currentThread() + " get ResourceB");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resourceA");
                synchronized (resourceA) {
                    System.out.println(Thread.currentThread() + " get resourceA");
                }
            }
        },"my-arthas-thread3");
        threadA.start();
        threadB.start();
    }
}

查看死锁:

通过thread -b查看死锁情况:

查看CPU飙升:

通过dashboard就能查看CPU占用情况:

查看GC情况:

通过dashboard就能查看GC情况:

查看接口调用太慢:

通过stack 来查看方法调用次数和时长。

四、总结

参考资料

  1. Arthas官网:https://arthas.aliyun.com/
  2. Arthas 使用详解:https://blog.csdn.net/zhangcongyi420/article/details/127252866
  3. 5-4-问题排查:https://www.pdai.tech/md/interview/x-interview.html#_5-4-问题排查 本文由博客一文多发平台 OpenWrite 发布!
相关推荐
今天的砖头有点烫手啊15 小时前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java·jvm
凯凯姜16 小时前
JVM 内存持续增长与 Full GC 频繁
jvm
驭渊的小故事17 小时前
从 JVM 底层看泛型:泛型擦除、Signature 属性与 Super Type Token 模式
java·开发语言·jvm
香蕉大香蕉(06敬畏市场)2 天前
高频八股 · Java 并发编程(10):异步、ThreadLocal 与虚拟线程(收官)
java·开发语言·网络·jvm·python·ai·实习
wuminyu2 天前
JVM规范学习总结-Class文件结构
java·linux·c语言·jvm·c++
酌沧2 天前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
wuminyu3 天前
JVM规范学习总结-Java源码经过javac编译后产物
java·linux·c语言·jvm·c++
学到老活到老4 天前
类已经加载了,为什么静态代码还没执行?
java·jvm
学到老活到老4 天前
写了 new,就一定会在堆上分配对象吗?
java·jvm
笨笨饿4 天前
# 59_CSDN博客自动写流程文章
linux·jvm·stm32·单片机·嵌入式硬件·mcu·51单片机