title: Arthas

Arthas - 图1

::: tip

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

:::

1、Arthas介绍

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

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

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

2、Arthas安装

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

下载地址: https://arthas.aliyun.com/arthas-boot.jar

Arthas - 图2

启动完成后,arthas会检测系统中的java进程,需要手动输入应用名称对用的编号:

比如输入: 4 回车

看到下面的界面说明启动成功,已经进入arthas的命令模式,就可以使用命令操作arthas

Arthas - 图3

3、Arthas常用命令

dashboard命令

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

Arthas - 图4

  1. ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPTED DAEMON
  2. 38 File Watcher main 5 TIMED_WAITI 1.25 0.062 0:3.156 false true
  3. 74 Timer-for-arthas-dashboard-94d722e6- system 5 RUNNABLE 0.63 0.031 0:0.125 false true
  4. -1 C1 CompilerThread9 - -1 - 0.31 0.015 0:0.296 false true
  5. -1 C1 CompilerThread8 - -1 - 0.31 0.015 0:0.375 false true
  6. -1 C1 CompilerThread10 - -1 - 0.31 0.015 0:0.343 false true
  7. 2 Reference Handler system 10 WAITING 0.0 0.000 0:0.000 false true
  8. 3 Finalizer system 8 WAITING 0.0 0.000 0:0.015 false true
  9. 4 Signal Dispatcher system 9 RUNNABLE 0.0 0.000 0:0.000 false true
  10. 5 Attach Listener system 5 RUNNABLE 0.0 0.000 0:0.031 false true
  11. 21 RMI TCP Accept-0 system 5 RUNNABLE 0.0 0.000 0:0.562 false true
  12. 29 RMI Scheduler(0) system 5 TIMED_WAITI 0.0 0.000 0:0.000 false true
  13. 61 arthas-timer system 5 WAITING 0.0 0.000 0:0.000 false true
  14. 64 arthas-NettyHttpTelnetBootstrap-3-1 system 5 RUNNABLE 0.0 0.000 0:0.031 false true
  15. 65 arthas-NettyWebsocketTtyBootstrap-4- system 5 RUNNABLE 0.0 0.000 0:0.000 false true
  16. 66 arthas-NettyWebsocketTtyBootstrap-4- system 5 RUNNABLE 0.0 0.000 0:0.000 false true
  17. 67 arthas-shell-server system 5 TIMED_WAITI 0.0 0.000 0:0.000 false true
  18. 68 arthas-session-manager system 5 TIMED_WAITI 0.0 0.000 0:0.000 false true
  19. 69 arthas-UserStat system 5 WAITING 0.0 0.000 0:0.000 false true
  20. 71 arthas-NettyHttpTelnetBootstrap-3-2 system 5 RUNNABLE 0.0 0.000 0:0.125 false true
  21. 73 arthas-command-execute system 5 TIMED_WAITI 0.0 0.000 0:0.000 false true
  22. Memory used total max usage GC
  23. heap 156M 320M 3495M 4.49% gc.ps_scavenge.count 6
  24. ps_eden_space 142M 144M 1285M 11.11% gc.ps_scavenge.time(ms) 47
  25. ps_survivor_space 0K 13312K 13312K 0.00% gc.ps_marksweep.count 2
  26. ps_old_gen 14M 163M 2621M 0.54% gc.ps_marksweep.time(ms) 93
  27. nonheap 61M 65M -1 94.61%
  28. code_cache 11M 11M 240M 4.73%
  29. metaspace 44M 47M -1 93.77%
  30. compressed_class_space 6M 6M 1024M 0.59%
  31. direct 8K 8K - 100.01%
  32. mapped 0K 0K - 0.00%
  33. Runtime
  34. os.name Windows 10
  35. os.version 10.0
  36. java.version 1.8.0_291
  37. java.home C:\Program Files\Java\jdk1.8.0_291\jre
  38. systemload.average -1.00
  39. processors 16
  40. timestamp/uptime Tue May 31 17:25:27 CST 2022/432s

jad命令

使用jad 后面跟上类的全限定名,反编译指定的类

jad com.qf.daily.controller.DailyController

  1. [arthas@21092]$ jad com.qf.daily.controller.DailyController
  2. ClassLoader:
  3. +-org.springframework.boot.devtools.restart.classloader.RestartClassLoader@2c6b4da9
  4. +-sun.misc.Launcher$AppClassLoader@18b4aac2
  5. +-sun.misc.Launcher$ExtClassLoader@27082746
  6. Location:
  7. /C:/Users/zed/Desktop/daily/target/classes/
  8. package com.qf.daily.controller;
  9. import com.github.pagehelper.PageInfo;
  10. import com.qf.daily.domain.Daily;
  11. import com.qf.daily.response.Response;
  12. import com.qf.daily.service.DailyService;
  13. import java.util.Date;
  14. import org.springframework.web.bind.annotation.GetMapping;
  15. import org.springframework.web.bind.annotation.PathVariable;
  16. import org.springframework.web.bind.annotation.PostMapping;
  17. import org.springframework.web.bind.annotation.RequestBody;
  18. import org.springframework.web.bind.annotation.RequestMapping;
  19. import org.springframework.web.bind.annotation.RestController;
  20. @RestController
  21. @RequestMapping(value={"daily"})
  22. public class DailyController {
  23. private final DailyService dailyService;
  24. public DailyController(DailyService dailyService) {
  25. this.dailyService = dailyService;
  26. }
  27. @21092]$
  28. @GetMapping(value={"view/{id}"})
  29. public Response<Daily> viewDailyById(@PathVariable(value="id") Integer id) {
  30. /*40*/ return Response.success((Object)this.dailyService.selectById(id));
  31. }
  32. }
  33. Affect(row-cnt:1) cost in 774 ms.
  34. [arthas@21092]$

watch命令

通过watch命令来查看函数的返回值,参数,异常信息

Arthas - 图5

  1. watch com.qf.daily.controller.DailyController viewDailyById {params[0],returnObj.data}

watch 完整的类名 方法名 {params表示参数,returnObj表示返回值,throwExp:表示抛出的异常}

trace命令

跟踪方法内部调用路径,并输出方法路径上的每个节点上耗时

Arthas - 图6

  1. trace com.qf.daily.controller.UserDailyController add

trace 类的完整限定名 方法名

作用:跟踪方法调用链上的耗时

退出Arthas

  1. [arthas@21092]$ exit
  2. PS C:\Users\zed\Desktop> # 退出了Arthas