阿里巴巴Arthas是一种诊断工具,使我们能够监控、分析和排除Java应用程序的故障。下面,我们将首先安装Arthas,然后通过案例来演示Arthas的一些关键功能。

下载

首先,我们可以使用curl下载Arthas:

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar -h

如果成功,我们应该看到显示所有命令的帮助指南:

案例分析

启动math-game

下载启动math-game.jar:

curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar

启动arthas

启动arthas-boot.jar:

java -jar arthas-boot.jar

arthas会提示一个菜单来选择我们要附加到哪个进程:

让我们选择名称为math-game.jar的那个,只需要输入前面的数字,在上图中为“1”,然后按Enter。

Arthas现在将附加到这个进程并开始。

我们可以通过help命令来获取有关可用选项的更多信息。

dashboard

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

上图各项内容,从上往下、从左往右依次表示:

  1. 顶部用于显示当前运行的线程
  2. 最重要的列之一,是每个线程CPU消耗的百分比
  3. 显示每个线程的CPU时间
  4. 用于内存分析,列出各个不同的内存区域及其统计信息。在右侧还可以了解GC相关的信息
  5. 展示关于主机平台和JVM的信息

thread

我们可以通过dashboard找出CPU占用较多的线程,然后通过下面定位对应的线程:

thread 1

作为参数传递的数字是线程id,通常1是main函数的线程

反编译java类

我们可以通过arthas来反编译我们正在运行的java应用的类

jad demo.MathGame

搜索类

search class命令在搜索JVM中加载的类时会派上用场。

sc *MathGame*

一旦我们有了类的名称,我们就可以使用两个额外的标志来查找更多的信息

sc -df demo.MathGame
  • -d显示类的详细信息
  • -f显示类的字段

搜索方法

同样可以使用sm命令来搜索类中已加载的方法

sm demo.MathGame

我们也可以使用-d来检索方法的详细信息

sm -d demo.MathGame primeFactors

watch

通过watch命令追踪 demo.MathGame 类 primeFactors 方法的返回值

watch demo.MathGame primeFactors returnObj

火焰图

我们可以通过 profiler start 来运行分析器,这是个非阻塞任务,即不会影响到工作线程。通过 profiler stop 停止分析器,此时会保存一个 FlameGraph 图像。

可以通过观察上图发现CPU时间花费在哪里。