Arthas 排查JVM问题总结

简介: Arthas 排查JVM问题总结

一、安装

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

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

image-20230908101838783

二、常见命令

  • dashboard:查看JVM全局概览,包括线程、堆内存、GC还有系统信息等

image-20230908004057353

  • thread:常见命令,查看线程。通过thread 查看线程详情信息。

image-20230908004335178

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

image-20230908004426789

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

image-20230908004631929

  • watch:查看方法参数

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

  • stack:查看方法调用路径

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

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

image-20230908005400528

三、实践

示例代码

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查看死锁情况:

image-20230908104407779

查看CPU飙升

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

image-20230908104527155

查看GC情况

通过dashboard就能查看GC情况:

image-20230908104659145

查看接口调用太慢

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

image-20230908105101387

四、总结

E4B52353-A4D1-413A-A98F-68658D32F749

参考资料

  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-问题排查
目录
相关文章
|
4月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
416 3
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
43 3
|
6月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
63 0
|
6月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
153 0
|
4月前
|
监控 安全 Java
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
118 2
|
4月前
|
监控 Java Linux
JVM内存问题之如果堆内存一直缓慢上涨,如何解决
JVM内存问题之如果堆内存一直缓慢上涨,如何解决
592 1
|
4月前
|
缓存 算法 Java
JVM内存溢出(OutOfMemory)异常排查与解决方法
JVM内存溢出(OutOfMemory)异常排查与解决方法
|
6月前
|
存储 监控 Java
三万字长文:JVM内存问题排查Cookbook
本文主要系统性地整理了排查思路,为大家遇到问题时提供全面的排查流程,不至于漏掉某些可能性误入歧途浪费时间。
|
6月前
|
Java Linux Arthas
linux上如何排查JVM内存过高?
linux上如何排查JVM内存过高?
1088 0
|
6月前
|
监控 算法 Java
JVM问题排查宝典
本文介绍了JVM问题排查与学习的经验,包括使用VisualVM监控本地JVM、通过GCViewer和gceasy分析GC日志、使用MAT分析OOM以及查询官方JVM参数。还提到了一个第三方网站HeapDump,提供简化版的JVM参数分析和生成服务,以快速生成适合特定环境的JVM配置。此外,推荐了几本深入学习JVM的书籍,并提供了进一步学习JVM问题的资源。
80 1