Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,可以方便的定位和诊断线上程序运行问题。Arthas 官方文档十分详细,详见:https://alibaba.github.io/arthas
Arthas使用
- # github下载arthas
- wget https://alibaba.github.io/arthas/arthas‐boot.jar
- # 或者 Gitee 下载
- wget https://arthas.gitee.io/arthas‐boot.jar
用java -jar运行即可,可以识别机器上所有Java进程(我们这里之前已经运行了一个Arthas测试程序,代码见下方)

1 package com.tuling.jvm;
2
3 import java.util.HashSet;
4
5 public class Arthas {
6
7 private static HashSet hashSet = new HashSet();
8
- public static void main(String[] args) {
- // 模拟 CPU 过高
- cpuHigh();
- // 模拟线程死锁
- deadThread();
- // 不断的向 hashSet 集合增加数据
- addHashSetThread();
16 }
17
18 /**
19 * 不断的向 hashSet 集合添加数据
20 */
- 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();
32 }
33 }
34 }).start();
35 }
36
- public static void cpuHigh() {
- new Thread(() ‐> {
- while (true) {
40
41 }
42 }).start();
43 }
44
45 /**
46 * 死 锁
47 */
48 private static void deadThread() {
49 /** 创建资源 */
- 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();
60 }
- System.out.println(Thread.currentThread() + "waiting get resourceB");
- synchronized (resourceB) {
- System.out.println(Thread.currentThread() + " get resourceB");
64 }
65 }
66 });
67
- Thread threadB = new Thread(() ‐> {
- synchronized (resourceB) {
- System.out.println(Thread.currentThread() + " get ResourceB");
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
75 }
- System.out.println(Thread.currentThread() + "waiting get resourceA");
- synchronized (resourceA) {
- System.out.println(Thread.currentThread() + " get resourceA");
79 }
80 }
81 });
- threadA.start();
- threadB.start();
84 }
85 }
选择进程序号1,进入进程信息操作

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

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

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

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

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

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

更多命令使用可以用help命令查看,或查看文档:https://alibaba.github.io/arthas/commands.html#arthas