【后端】Arthas教程

1、Arthas简介

        Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,可以方便的定位和诊断线上程序运行问题。Arthas相关官方文档十分详细,官网地址可参考:https://alibaba.github.io/arthas

2、Arthas使用场景

        阿里巴巴的Arthas 有强大且丰富的功能,在 Arthas 中能做的事情超乎想象。Arthas常用的一些还有场景,更多的使用场景可以在熟悉了 Arthas 之后自行探索。

为什么系统的 CPU 又升高了 ?

程序运行耗时很长,如何监测呢?

能否有一个全局视角来查看系统的运行状况?

我改的代码为什么没有执行到?

系统运行的多线程有死锁吗?

有什么办法可以监控到 JVM 的实时运行状态?

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

3、Arthas使用方法

gitee使用教程:arthas

下载jar包:
github下载地址icon-default.png?t=O83Ahttps://github.com/alibaba/arthas/releases

maven下载icon-default.png?t=O83Ahttps://arthas.aliyun.com/download/latest_version?mirror=aliyun 启动:

 as.sh 

./as.sh

用java -jar运行即可,可以识别机器上所有Java进程 

java -jar arthas-boot.jar

测试java代码:

import java.util.HashSet;
public class Arthas {
    private static HashSet hashSet = new HashSet();
    public static void main(String[] args) {
    // 模拟 CPU 过高
    mockCpuHigh();
    // 模拟线程死锁
    mockDeadThread();
    // 不断的向 hashSet 集合增加数据
    mockAddHashSetThread();
}

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

public static void mockCpuHigh() {
  new Thread(() ‐> {
    while (true) {

     }
  }).start();
}

/**
* 死锁模拟
 */
private static void mockDeadThread() {
    /** 创建资源 */
    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");
    }
     }
});

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");
    }
    }
    });
    threadA.start();
    threadB.start();
    }
}


 

选择进程序号1,进入进程信息操作

 输入dashboard可以查看整个进程的运行情况,线程、内存、GC、运行环境信息:

 输入thread可以查看线程详细情况

 输入 thread加上线程ID 可以查看线程堆栈

输入 thread -b 可以查看线程死锁

输入 jad加类的全名 可以反编译,这样可以方便我们查看线上代码是否是正确的版本

 

使用 ognl 命令可以查看线上系统变量的值,甚至可以修改变量的值

可以使用提供的代码,模拟相关情况,进行调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shinelord明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值