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下载地址https://github.com/alibaba/arthas/releases
maven下载https://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 命令可以查看线上系统变量的值,甚至可以修改变量的值
可以使用提供的代码,模拟相关情况,进行调试。