0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Arthas -- 一款释放潜力的神器

马哥Linux运维 来源:马哥Linux运维 2023-07-05 11:21 次阅读

大家好,我是Yuan,今天给大家介绍一款调优神器 -- 阿里巴巴Arthas,可以帮助你的应用释放潜力。

1. 介绍

阿里巴巴 Arthas 是一个诊断工具,可以用于监视、分析和解决 Java 应用程序的问题。使用 Arthas 的一个主要优点是,我们不需要修改代码,甚至不需要重新启动我们想要监视的 Java 服务。

在本教程中,我们将首先安装 Arthas,在此之后,通过一个简单的案例来演示 Arthas 的一些关键特性。

最后,由于 Arthas 是用 Java 编写的,因此它是跨平台的,可以在 Linux、macOS 和 Windows 上运行。

2. 下载和入门

首先,我们可以通过直接下载链接或使用curl来下载 Arthas 库:

curl-Ohttps://alibaba.github.io/arthas/arthas-boot.jar

现在,让我们通过运行带有-h(帮助)选项的 Arthas 来测试它是否工作:

java-jararthas-boot.jar-h

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

9732543c-1a78-11ee-962d-dac502259ad0.png

3. 案例分析

在本教程中,我们将使用一个非常简单的应用程序,基于利用递归实现的斐波那契数列的相对低效的实现方式:

publicclassFibonacciGenerator{

publicstaticvoidmain(String[]args){
System.out.println("按任意键继续");
System.in.read();
for(inti=0;i< 100;i++){
longresult=fibonacci(i);
System.out.println(format("fib(%d):%d",i,result));
}
}

publicstaticlongfibonacci(intn){
if(n==0||n==1){
return1L;
}else{
returnfibonacci(n-1)+fibonacci(n-2);
}
}
}

这个示例的最有趣的部分是遵循斐波那契数列的数学定义的 fibonacci 方法。

在 main 方法中,我们使用一个循环和相对较大的数字,以便让计算机进行较长时间的计算。这当然正是我们想要的,以便演示 Arthas。

4. 启动 Arthas

现在让我们试试 Arthas!我们需要做的第一件事是运行我们的小型斐波那契应用程序。我们可以使用我们喜欢的 IDE 或直接在终端中运行它。它会要求按下一个键才能启动。我们将在将进程附加到 Arthas 之后按下任意键。

现在,让我们运行 Arthas 可执行文件:

java-jararthas-boot.jar

Arthas 提示选择要附加到的进程:

[INFO]arthas-bootversion:3.1.7
[INFO]Foundexistingjavaprocess,pleasechooseoneandhitRETURN.
*[1]:25500com.baeldung.arthas.FibonacciGenerator
...

让我们选择名称为 com.baeldung.arthas.FibonacciGenerator 的进程。在此示例中,只需在列表中输入数字‘1’并按 Enter 即可。

Arthas 现在会附加到该进程并启动:

[INFO]Trytoattachprocess25500
[INFO]Attachprocess25500success.
...

一旦 Arthas 启动,我们就有一个提示符,可以发出不同的命令。

我们可以使用 help 命令获取有关可用选项的更多信息。为了方便使用 Arthas,我们还可以使用 tab 键来自动完成其命令。

在将 Arthas 附加到进程后,我们现在可以按下一个键,程序将开始打印斐波那契数。

5. 仪表盘

一旦 Arthas 启动,我们可以使用仪表盘。在这种情况下,我们通过输入 "dashboard" 命令来使用仪表盘。现在,我们可以看到一个详细的屏幕,其中包含多个面板和关于我们的 Java 进程的许多信息:

97484792-1a78-11ee-962d-dac502259ad0.png

让我们更详细地看一下其中的一些内容:

  • 顶部区域专门显示当前正在运行的线程
  • 一个重要的列是每个线程的 CPU 使用情况
  • 第三部分显示每个线程的 CPU 时间
  • 另一个有趣的面板是内存分析。不同的内存区域以及它们的统计信息都列在其中。在右侧,我们有垃圾收集器的信息
  • 最后,在第五部分,我们有关于主机平台和 JVM 的信息

我们可以通过按下 "q" 键退出仪表盘。

我们应该记住,即使退出,Arthas 仍会附加到我们的进程上。因此,为了正确地从我们的进程中断开它的连接,我们需要运行 "stop" 命令。

6. 分析堆栈跟踪

在仪表盘中,我们看到我们的主进程占用了几乎 100% 的 CPU。该进程的 ID 是 1,在第一列中可以看到。

现在我们已经退出了仪表盘,我们可以通过运行 "thread" 命令来更详细地分析该进程:

thread1

作为参数传递的数字是线程 ID。Arthas 打印出一个堆栈跟踪信息,其中充斥着对 fibonacci 方法的调用。

如果堆栈跟踪信息很长而且难以阅读,可以使用 "thread" 命令结合 "grep" 命令来过滤:

thread1|grep'main('

这将只打印与 "grep" 命令匹配的行:

[arthas@25500]$thread1|grep'main('
atcom.baeldung.arthas.FibonacciGenerator.main(FibonacciGenerator.java:10)

7. 反编译Java类

假设我们正在分析一个我们对其中了解甚少或一无所知的Java应用程序,突然发现堆栈中充斥着以下类型的重复调用:

[arthas@59816]$thread1
"main"Id=1RUNNABLE
atapp//com.baeldung.arthas.FibonacciGenerator.fibonacci(FibonacciGenerator.java:18)
atapp//com.baeldung.arthas.FibonacciGenerator.fibonacci(FibonacciGenerator.java:18)
...

由于我们运行了Arthas,我们可以反编译一个类来查看其内容。为了实现这一点,我们可以使用jad命令,将限定类名作为参数传递:

jadcom.baeldung.arthas.FibonacciGenerator

类加载器:
+-jdk.internal.loader.ClassLoaders$AppClassLoader@799f7e29
+-jdk.internal.loader.ClassLoaders$PlatformClassLoader@60f1dd34

位置:
/home/amoreno/work/baeldung/tutorials/libraries-3/target/
/*
*反编译使用CFR。
*/
packagecom.baeldung.arthas;

importjava.io.IOException;
importjava.io.InputStream;
importjava.io.PrintStream;

publicclassFibonacciGenerator{
publicstaticvoidmain(String[]arrstring)throwsIOException{

输出是反编译的Java类和一些有用的元数据,如类的位置。这是一个非常有用和强大的功能。

8. 搜索类和搜索方法

搜索类命令在搜索JVM中加载的类时非常方便。我们可以使用它通过输入sc并将模式作为参数传递来使用,带或不带通配符:

[arthas@70099]$sc*Fibonacci*
com.baeldung.arthas.FibonacciGenerator
Affect(row-cnt:1)costin5ms.

一旦我们获得了类的限定名称,我们可以使用两个附加标志来查找更多信息:

  • -d显示类的详细信息
  • -f显示类的字段

然而,类的字段必须与详细信息一起查询:

[arthas@70099]$sc-dfcom.baeldung.arthas.FibonacciGenerator
class-infocom.baeldung.arthas.FibonacciGenerator
...

同样,我们可以使用sm(搜索方法)命令来查找类中加载的方法。在这种情况下,对于我们的类com.baeldung.arthas.FibonacciGenerator,我们可以运行:

[arthas@70099]$smcom.baeldung.arthas.FibonacciGenerator
com.baeldung.arthas.FibonacciGenerator()V
com.baeldung.arthas.FibonacciGeneratormain([Ljava/lang/String;)V
com.baeldung.arthas.FibonacciGeneratorfibonacci(I)J
Affect(row-cnt:3)costin4ms.

我们可以使用-d标志来检索方法的详细信息。最后,我们可以传递方法的名称作为可选参数,以缩小返回方法的数量:

sm-dcom.baeldung.arthas.FibonacciGeneratorfibonacci
declaring-classcom.baeldung.arthas.FibonacciGenerator
method-namefibonacci
modifierpublic,static
annotation
parametersint
returnlong
exceptions
classLoaderHash799f7e29

9. 监视方法调用

我们可以使用Arthas来监视方法,这在调试应用程序的性能问题时非常方便。为此,我们可以使用monitor命令。

monitor命令需要一个-c <秒数>标志和两个参数 - 限定类名和方法名。

对于我们的案例研究,让我们来调用monitor:

monitor-c10com.baeldung.arthas.FibonacciGeneratorfibonacci

正如我们所预期的,Arthas将每10秒打印有关fibonacci方法的指标:

Affect(class-cnt:1,method-cnt:1)costin47ms.
timestampclassmethodtotalsuccessfailavg-rt(ms)fail-rate
-----------------------------------------------------------------------------------------------------------------------------
2020-03-071126com.baeldung.arthas.FibonacciGeneratorfibonacci52895752895700.070.00%
...

对于那些最终失败的调用,我们也有指标 - 这对于调试很有用。

10. 监控方法参数

如果我们需要调试方法的参数,我们可以使用watch命令。但是,语法会稍微复杂一些:

watchcom.baeldung.arthas.FibonacciGeneratorfibonacci'{params[0],returnObj}''params[0]>10'-n10

让我们详细看一下各个参数:

  • 第一个参数是类名
  • 第二个参数是方法名
  • 第三个参数是定义我们要查看的内容的OGNL表达式 - 在这种情况下,它是第一个(也是唯一的)方法参数和返回值
  • 第四个和最后一个可选参数是用于过滤我们要监视的调用的布尔表达式

对于此示例,我们只想在参数大于10时监视。最后,我们添加一个标志来限制结果为10个:

watchcom.baeldung.arthas.FibonacciGeneratorfibonacci'{params[0],returnObj}''params[0]>10'-n10
按Q或Ctrl+C中断。
Affect(class-cnt:1,method-cnt:1)costin19ms.
ts=2020-02-172108;[cost=30.165211ms]result=@ArrayList[
@Integer[11],
@Long[144],
]
ts=2020-02-172108;[cost=50.405506ms]result=@ArrayList[
@Integer[12],
@Long[233],
]
...

在这里,我们可以看到带有CPU时间和输入/返回值的调用示例。

11. 分析器

对于那些对应用程序性能感兴趣的人来说,通过分析器命令提供了一种非常直观的能力。分析器将评估我们的进程正在使用的CPU的性能。

让我们通过运行profiler start来启动分析器。这是一个非阻塞的任务,意味着在分析器工作时我们可以继续使用Arthas。

随时可以通过运行profiler getSamples来询问分析器有多少个样本。

现在让我们使用profiler stop来停止分析器。此时,一个FlameGraph图像将被保存。在这个具体的案例中,我们有一个以斐波那契线程为主导的图表:

9760ec8e-1a78-11ee-962d-dac502259ad0.png

注意,当我们想要检测我们的CPU时间花在哪里时,这个图表特别有用。

12. 总结

在本教程中,我们探索了Arthas的一些最强大和有用的功能。

正如我们所见,Arthas有许多命令可以帮助我们诊断各种问题。当我们无法访问正在审查的应用程序的代码,或者我们想快速诊断在服务器上运行的有问题的应用程序时,它也可以特别有帮助。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • 阿里巴巴
    +关注

    关注

    7

    文章

    1571

    浏览量

    46436
  • 应用程序
    +关注

    关注

    37

    文章

    3136

    浏览量

    56398
收藏 人收藏

    评论

    相关推荐

    共模电容:又一款EMC滤波神器?|深圳比创达电子(上)

    共模电容:又一款EMC滤波神器?(上)相信不少人是有疑问的,今天深圳市比创达电子科技有限公司就跟大家解答下! 传统共模滤波器的局限性通常我们讨论EMC问题中的噪声及干扰,多是共模噪声、共模干扰
    发表于 12-25 10:53

    请推荐一款芯片

    现在要做个视频输出装置,主控为POWERPC或ARM,只带有通用并行接口,不带RGB输出接口,装置需要输出CVBS和VGA两种信号,请推荐一款可以使用通用并行接口做为输入、输出为CVBS+VGA
    发表于 01-17 14:11

    一款单片机

    本人想做一款皮肤水分测试仪,求一款裸片MCU,OTP的,带AD,可驱动lcd模块,价格块以内
    发表于 03-17 19:25

    开发了一款车灯驱动神器

    最近公司开发了一款车灯用的是 QX6103。QX6103是一款高精度降压型大功率LED恒流驱动芯片。适用于输入电压100V以内的大功率LED恒流驱动电源。专利的高端电流检测、固定频率、电流模PWM
    发表于 05-12 14:29

    分享一款2016好评如潮的diy设计神器

    `作为个学了两年室内设计专业的人,今天给大家发个福利说实话我专业学的并不是很好,但是我肯钻。平时也喜欢逛些学术类的贴吧论坛。前两天无意在豆瓣上看到个非常牛逼的设计神器这款
    发表于 05-25 12:12

    你们了解一款硬件吗

    你们知不知道有一款实体店都在用的一款,那个是什么原理 呢
    发表于 11-30 15:26

    麻烦推荐一款AD,用来处理滨松的一款TDI CCD

    麻烦推荐一款AD,用来处理滨松的一款TDI CCD,不胜感激!
    发表于 08-02 06:39

    MCU430AFE253读写神器

    MCU430AFE253读写神器
    发表于 09-19 13:07

    释放下一代车辆的无限潜力

    支持。DisplayPort视频流传输· 我们与Bitec合作展示了一款由低功耗莱迪思CertusPro-NX FPGA以及Bitec DisplayPort TX和RX IP组成的演示,可以将视频流从
    发表于 02-21 13:40

    全差分驱动器释放高速ADC性能潜力

    全差分驱动器释放高速ADC性能潜力 智能化集成 设计应用 结论
    发表于 09-15 16:06 13次下载

    Arthas可以解决哪些问题

    诊断利器 Arthas,是阿里的一款开源工具。Github-alibaba/arthas 上可以看到它的介绍
    的头像 发表于 12-24 14:22 611次阅读

    智慧医疗BI助你释放医疗大数据的潜力

    思迈特Smartbi可以帮你释放医疗大数据潜力,下面是Smartbi的智慧医疗BI系统。
    发表于 04-12 16:27 601次阅读
    智慧医疗BI助你<b class='flag-5'>释放</b>医疗大数据的<b class='flag-5'>潜力</b>

    释放所有闪存阵列的全部潜力

    电子发烧友网站提供《释放所有闪存阵列的全部潜力.pdf》资料免费下载
    发表于 08-30 11:05 0次下载
    <b class='flag-5'>释放</b>所有闪存阵列的全部<b class='flag-5'>潜力</b>

    共模电容:又一款EMC滤波神器

    共模电容:又一款EMC滤波神器?|深圳比创达电子(上)
    的头像 发表于 12-25 10:54 296次阅读
    共模电容:又<b class='flag-5'>一款</b>EMC滤波<b class='flag-5'>神器</b>?

    介绍一款基于java的渗透测试神器-CobaltStrike

    Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器
    的头像 发表于 01-16 09:16 283次阅读
    介绍<b class='flag-5'>一款</b>基于java的渗透测试<b class='flag-5'>神器</b>-CobaltStrike