Alibaba Java诊断工具Arthas之快速安装和简单使用

Alibaba Java诊断工具Arthas简单介绍 :

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

1.这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
2.我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
3.遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
4.线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
5.是否有一个全局视角来查看系统的运行状况?
6.有什么办法可以监控到JVM的实时运行状态?

Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

一、快速安装

这里我们使用官网推荐的arthas-boot

下载arthas-boot.jar,然后用java -jar的方式启动:

1 wget https://alibaba.github.io/arthas/arthas-boot.jar
2 java -jar arthas-boot.jar

打印帮助信息:

1 java -jar arthas-boot.jar -h

二、简单使用

1.下载官方提供的Demo并启动

arthas-demo是一个简单的程序,每隔一秒生成一个随机数,再执行质因式分解,并打印出分解结果。

1 wget https://alibaba.github.io/arthas/arthas-demo.jar
2 java -jar arthas-demo.jar

2.重新java -jar启动下载好的arthas jar包

1 java -jar arthas-boot.jar

启动完将看到:

1 ?  githubTools java -jar arthas-boot.jar
2 [INFO] arthas-boot version: 3.1.0
3 [INFO] Found existing java process, please choose one and hit RETURN.
4 * [1]: 6419 arthas-demo.jar
5   [2]: 823

3.选择应用java进程

Demo进程是第1个,则输入1,再输入回车/enter。Arthas会attach到目标进程上,并输出日志:

 1 [INFO] arthas home: /Users/zhangboqing/.arthas/lib/3.1.0/arthas
 2 [INFO] Try to attach process 6419
 3 [INFO] Attach process 6419 success.
 4 [INFO] arthas-client connect 127.0.0.1 3658
 5   ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 6  /  O  \ |  .--. ‘‘--.  .--‘|  ‘--‘  | /  O  \ ‘   .-‘
 7 |  .-.  ||  ‘--‘.‘   |  |   |  .--.  ||  .-.  |`.  `-.
 8 |  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-‘    |
 9 `--‘ `--‘`--‘ ‘--‘   `--‘   `--‘  `--‘`--‘ `--‘`-----‘
10
11
12 wiki: https://alibaba.github.io/arthas
13 version: 3.1.0
14 pid: 6419
15 time: 2019-02-16 23:22:11
16
17 $

这样就进入到对应的进程中了,接下来的操作都是在当前进程中的

3.简单命令介绍

1)dashboard
输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。

 1 ID             NAME                                         GROUP                         PRIORITY      STATE          %CPU           TIME           INTERRUPTED    DAEMON
 2 21             Timer-for-arthas-dashboard-b47de3b0-268b-4d6 system                        10            RUNNABLE       76             0:0            false          true
 3 15             nioEventLoopGroup-3-1                        system                        10            RUNNABLE       23             0:0            false          false
 4 11             AsyncAppender-Worker-arthas-cache.result.Asy system                        9             WAITING        0              0:0            false          true
 5 9              Attach Listener                              system                        9             RUNNABLE       0              0:0            false          true
 6 3              Finalizer                                    system                        8             WAITING        0              0:0            false          true
 7 2              Reference Handler                            system                        10            WAITING        0              0:0            false          true
 8 4              Signal Dispatcher                            system                        9             RUNNABLE       0              0:0            false          true
 9 19             as-command-execute-daemon                    system                        10            TIMED_WAITING  0              0:0            false          true
10 13             job-timeout                                  system                        9             TIMED_WAITING  0              0:0            false          true
11 1              main                                         main                          5             TIMED_WAITING  0              0:0            false          false
12 14             nioEventLoopGroup-2-1                        system                        10            RUNNABLE       0              0:0            false          false
13 18             nioEventLoopGroup-2-2                        system                        10            RUNNABLE       0              0:0            false          false
14 16             pool-1-thread-1                              system                        5             TIMED_WAITING  0              0:0            false          false
15 17             pool-2-thread-1                              system                        5             WAITING        0              0:0            false          false
16
17
18
19
20
21 Memory                                 used        total        max          usage        GC
22 heap                                   39M         123M         1820M        2.16%        gc.ps_scavenge.count                         3
23 ps_eden_space                          28M         32M          672M         4.20%        gc.ps_scavenge.time(ms)                      32
24 ps_survivor_space                      4M          5M           5M           99.38%       gc.ps_marksweep.count                        0
25 ps_old_gen                             6M          85M          1365M        0.45%        gc.ps_marksweep.time(ms)                     0
26 nonheap                                19M         20M          -1           96.34%
27 code_cache                             4M          4M           240M         1.78%
28 metaspace                              13M         13M          -1           96.48%
29 compressed_class_space                 1M          1M           1024M        0.16%
30 direct                                 0K          0K           -            Infinity%
31 Runtime
32 os.name                                      Mac OS X
33 os.version                                   10.14
34 java.version                                 1.8.0_112
35 java.home                                    /Library/Java/JavaVirtualMachines/jdk1.8.0_1
36                                              12.jdk/Contents/Home/jre
37 systemload.average                           1.69
38 processors                                   4

2)thread

通过thread命令来获取到arthas-demo进程的Main Class
thread 1会打印线程ID 1的栈,通常是main函数的线程。

1 $ thread 1
2 "main" Id=1 TIMED_WAITING
3     at java.lang.Thread.sleep(Native Method)
4     at java.lang.Thread.sleep(Thread.java:340)
5     at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
6     at demo.MathGame.main(MathGame.java:17)
7
8 Affect(row-cnt:0) cost in 17 ms.

3)jad

通过jad来反编译Main Class

 1 $ jad demo.MathGame
 2
 3 ClassLoader:
 4 +-sun.misc.Launcher$AppClassLoader@6bc7c054
 5   +-sun.misc.Launcher$ExtClassLoader@7e97d617
 6
 7 Location:
 8 /Users/zhangboqing/Software/githubTools/arthas-demo.jar
 9
10 /*
11  * Decompiled with CFR 0_132.
12  */
13 package demo;
14
15 import java.io.PrintStream;
16 import java.util.ArrayList;
17 import java.util.Iterator;
18 import java.util.List;
19 import java.util.Random;
20 import java.util.concurrent.TimeUnit;
21
22 public class MathGame {
23     private static Random random = new Random();
24     public int illegalArgumentCount = 0;
25
26     public static void main(String[] args) throws InterruptedException {
27         MathGame game = new MathGame();
28         do {
29             game.run();
30             TimeUnit.SECONDS.sleep(1L);
31         } while (true);
32     }
33
34     public void run() throws InterruptedException {
35         try {
36             int number = random.nextInt() / 10000;
37             List<Integer> primeFactors = this.primeFactors(number);
38             MathGame.print(number, primeFactors);
39         }
40         catch (Exception e) {
41             System.out.println(String.format("illegalArgumentCount:%3d, ", this.illegalArgumentCount) + e.getMessage());
42         }
43     }
44
45     public static void print(int number, List<Integer> primeFactors) {
46         StringBuffer sb = new StringBuffer("" + number + "=");
47         Iterator<Integer> iterator = primeFactors.iterator();
48         while (iterator.hasNext()) {
49             int factor = iterator.next();
50             sb.append(factor).append(‘*‘);
51         }
52         if (sb.charAt(sb.length() - 1) == ‘*‘) {
53             sb.deleteCharAt(sb.length() - 1);
54         }
55         System.out.println(sb);
56     }
57
58     public List<Integer> primeFactors(int number) {
59         if (number < 2) {
60             ++this.illegalArgumentCount;
61             throw new IllegalArgumentException("number is: " + number + ", need >= 2");
62         }
63         ArrayList<Integer> result = new ArrayList<Integer>();
64         int i = 2;
65         while (i <= number) {
66             if (number % i == 0) {
67                 result.add(i);
68                 number /= i;
69                 i = 2;
70                 continue;
71             }
72             ++i;
73         }
74         return result;
75     }
76 }
77
78 Affect(row-cnt:1) cost in 830 ms.
79 $

4)watch

通过watch命令来查看demo.MathGame#primeFactors函数的返回值:

 1 watch demo.MathGame primeFactors returnObj
 2 Press Q or Ctrl+C to abort.
 3 Affect(class-cnt:1 , method-cnt:1) cost in 59 ms.
 4 ts=2019-02-16 23:31:38; [cost=1.710847ms] result=null
 5 ts=2019-02-16 23:31:39; [cost=0.079354ms] result=null
 6 ts=2019-02-16 23:31:40; [cost=0.251734ms] result=@ArrayList[
 7     @Integer[2],
 8     @Integer[2],
 9     @Integer[2],
10     @Integer[2],
11     @Integer[2],
12     @Integer[2],
13     @Integer[2],
14     @Integer[2],
15     @Integer[5],
16     @Integer[109],
17 ]

4.退出arthas

如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出arthas,可以执行shutdown命令。

附录:

Arthas 用户文档https://alibaba.github.io/arthas/quick-start.html

Arthas github地址: https://github.com/alibaba/arthas

原文地址:https://www.cnblogs.com/756623607-zhang/p/10389844.html

时间: 2024-10-26 17:21:07

Alibaba Java诊断工具Arthas之快速安装和简单使用的相关文章

Arthas Alibaba 开源 Java 诊断工具

Arthas 用户文档 English Docs Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug

Java诊断利器Arthas优雅排查生产环境

前言 Arthas 是Alibaba开源的Java诊断工具.在线排查问题,无需重启:动态跟踪Java代码:实时监控JVM状态.对分秒必争的线上异常,Arthas可帮助我们快速诊断相关问题. 下载安装 下载Arthas的arthas-boot.jar wget https://alibaba.github.io/arthas/arthas-boot.jar 下载arthas之后,先来了解帮助信息,可以通过java -jar arthas-boot.jar -h命令查看,这里给出了一些例子和参数说明

阿里内部史上最牛逼的带闪电的java诊断工具开源码

在阿里巴巴内部,有很多自研工具供开发者使用,其中有一款工具,是几乎每个Java开发都使用过的工具,那就是Arthas,这是一款Java诊断工具,是一款牛逼带闪电的工具.该工具已于2018年9月份开源. 在日常开发中,你是否遇到过以下问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法

报表工具Stimulsoft Reports快速生成.NET简单列报表

在.NET开发中经常会涉及到报表的开发,通常我们采用报表工具来快速生成报表,报表生成工具最常用的是水晶报表.Stimusoft Reports,下面我们以Stimulsoft Reports为例,做一个快速生成报表的教程,同时水晶报表也可以同时导入到Stimulsoft Reports中使用. 现在开始创建简单列报表: 打开VS2012,找到Stimulsoft Reports控件 1.运行报表工具的报表设计器 2.连接数据库: 2.1创建新的连接 2.2创建新的数据源 3.把需要展现在报表上的

Java开源诊断工具 Arthas 发布v3.1.0

ArthasArthas 自2018年9月份上线以来「传送门」,已收获近万个star,感谢开发者们的认可.此次Arthas 3.1.0版本的发布,不仅带来大家投票出来的新LOGO,还带来强大的新功能和更好的易用性,下面一一介绍. 在线教程在新版本Arthas里,增加了在线教程,用户可以在线运行Demo,一步步学习Arthas的各种用法,推荐新手尝试: Arthas基础教程Arthas进阶教程非常欢迎大家来完善这些教程. 增加内存编译器支持,在线编辑热更新代码3.1.0版本里新增命令mc,不是方块

初识阿里开源诊断工具Arthas

上个月,阿里开源了一个名为Arthas的监控工具.恰逢近期自己在写多线程处理业务,由此想到了一个问题. 如果在本机开发调试,IDE可以看到当前的活动线程,例如IntelliJ IDEA,线程是运行还是休眠,在Debugger→Threads可以看到.倘若代码写完提交,到测试环境上构建,要怎样才能看到测试服务器上的线程运行情况呢? 前面客套完了,教程GitHub上面也有,这里主要讲下个人在部署的过程和踩到的坑.仅供参考. GitHub: https://github.com/alibaba/art

Cpu飚高show-busy-java-threads一件脚本排查与Arthas线上诊断工具排查实战

spring boot 模拟飚高代码 @Servicepublic class TestWhile{    /* 操作内存对象 */    ConcurrentHashMap map = new ConcurrentHashMap();    private void whileTrue(String threadName) {        // 不设置退出条件,死循环        while (true) {            // 在死循环中不断的对map执行put操作,导致内存gc

Java开发工具

每一个程序员都有一个自己的开发工具,使用得心应手,好的工具能做到事半功倍效果.但人与人不同,喜好不同,使用的工具也不同.就像侠客需要武器,十八般兵器,各有所长,每个侠客都有属于自己的兵器.下面介绍下IT界的兵器们: JDK (Java Development Kit)Java开发工具集 .Eclipse.MyEclipse.UltraEdit.Java Workshop.NetBeans 与Sun Java Studio 5.Borland 的JBuilder.Oracle 的JDevelope

SAP成都研究院非典型程序猿,菜园子小哥:当我用UI5诊断工具时我用些什么

身边有些年轻同事曾经向我表达过这种困扰:尽管完成日常工作没有任何问题,但是还想更进一步,把代码写得更好些,做到精益求精.现在写的代码能实现功能,但是不知道可以怎样写得更好. 除了阅读优秀的开源库开源框架,一点一滴积累之外,Jerry的一个建议是大家可以多琢磨琢磨每天工作使用到的一些工具,研究下这些工具里自己感兴趣的那些功能的实现原理.想一想这个功能如果让自己实现,该怎样去设计和编码,琢磨完之后再去看工具的实现,和自己心中所想进行比较.这样一来,既学习了这些工作优秀的设计和实现,又进一步熟悉了工作