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

这篇具有很好参考价值的文章主要介绍了Arthas -- 一款释放潜力的神器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1. 介绍

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

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

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

2. 下载和入门

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

curl -O https://alibaba.github.io/arthas/arthas-boot.jar

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

java -jar arthas-boot.jar -h

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

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

3. 案例分析

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

public class FibonacciGenerator {

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

    public static long fibonacci(int n) {
        if (n == 0 || n == 1) {
            return 1L;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
    }
}

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

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

4. 启动 Arthas

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

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

java -jar arthas-boot.jar

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

[INFO] arthas-boot version: 3.1.7
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 25500 com.baeldung.arthas.FibonacciGenerator
...

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

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

[INFO] Try to attach process 25500
[INFO] Attach process 25500 success.
...                     

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

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

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

5. 仪表盘

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

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

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

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

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

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

6. 分析堆栈跟踪

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

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

thread 1

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

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

thread 1 | grep 'main('

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

[arthas@25500]$ thread 1 | grep 'main('
    at com.baeldung.arthas.FibonacciGenerator.main(FibonacciGenerator.java:10)

7. 反编译Java类

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

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

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

jad com.baeldung.arthas.FibonacciGenerator

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

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

import java.io.IOException;
import java.io.InputStream;
importjava.io.PrintStream;

public class FibonacciGenerator {
    public static void main(String[] arrstring) throws IOException {

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

8. 搜索类和搜索方法

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

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

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

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

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

[arthas@70099]$ sc -df com.baeldung.arthas.FibonacciGenerator
  class-info        com.baeldung.arthas.FibonacciGenerator
  ...

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

[arthas@70099]$ sm com.baeldung.arthas.FibonacciGenerator
com.baeldung.arthas.FibonacciGenerator <init>()V
com.baeldung.arthas.FibonacciGenerator main([Ljava/lang/String;)V
com.baeldung.arthas.FibonacciGenerator fibonacci(I)J
Affect(row-cnt:3) cost in 4 ms.

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

sm -d com.baeldung.arthas.FibonacciGenerator fibonacci
 declaring-class  com.baeldung.arthas.FibonacciGenerator
 method-name      fibonacci
 modifier         public,static
 annotation
 parameters       int
 return           long
 exceptions
 classLoaderHash  799f7e29

9. 监视方法调用

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

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

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

monitor -c 10 com.baeldung.arthas.FibonacciGenerator fibonacci

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

Affect(class-cnt:1 , method-cnt:1) cost in 47 ms.
 timestamp            class                                          method     total   success  fail  avg-rt(ms)  fail-rate                                                                       
-----------------------------------------------------------------------------------------------------------------------------                                                                      
 2020-03-07 11:43:26  com.baeldung.arthas.FibonacciGenerator  fibonacci  528957  528957   0     0.07        0.00%
...                                                                           

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

10. 监控方法参数

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

watch com.baeldung.arthas.FibonacciGenerator fibonacci '{params[0], returnObj}' 'params[0]>10' -n 10

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

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

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

watch com.baeldung.arthas.FibonacciGenerator fibonacci '{params[0], returnObj}' 'params[0]>10' -n 10
按Q或Ctrl+C中断。
Affect(class-cnt:1 , method-cnt:1) cost in 19 ms.
ts=2020-02-17 21:48:08; [cost=30.165211ms] result=@ArrayList[
    @Integer[11],
    @Long[144],
]
ts=2020-02-17 21:48:08; [cost=50.405506ms] result=@ArrayList[
    @Integer[12],
    @Long[233],
]
...

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

11. 分析器

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

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

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

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

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

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

12. 总结

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

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


参考资料:

  1. 官方文档:https://arthas.aliyun.com/doc/
  2. Arthas的GitHub仓库地址:https://github.com/alibaba/arthas

 

作者|Yuan文章来源地址https://www.toymoban.com/news/detail-606462.html

到了这里,关于Arthas -- 一款释放潜力的神器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线上诊断神器-arthas基本应用

    什么是Arthas呢? ​Arthas 是一款阿里推出的 线上监控诊断产品 ,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题

    2023年04月20日
    浏览(32)
  • Python自动化办公:提升效率,释放潜力(借助AI实现)

    欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。搜索关注公粽号《机器和智能》即可领取技术大礼包

    2024年02月15日
    浏览(48)
  • 一文了解潜力黑马Infiblue:借力Web3,释放元宇宙价值

    2013 年,JDN Dionisio 曾发表了一篇名为《3D Virtual Worlds and the Metaverse: Current Status and Future Possibilities》的论文,深入探讨与归纳了虚拟世界的几个发展阶段,可以简单的归纳为: 第一阶段:基于计算机文本所构建的虚拟世界 第二阶段:包含 2D 图形界面、具有社交元素的虚拟世界

    2024年02月13日
    浏览(39)
  • Github 打不开官网不能使用命令,现在一款简单又实用的免费 GitHub 加速神器介绍给你!

    今天给继续大家推荐一个堪称 GitHub 加速神器的开源项目。 这个开源项目就是: FastGitHub ,它主要解决 GitHub 打不开、用户头像无法加载、releases 无法上传下载、git-clone、git-pull、git-push 失败等问题。 该项目的好处就是专门针对 GitHub 访问速度慢的问题,具有合法性,可靠性,

    2024年02月03日
    浏览(60)
  • 深度剖析JVM调优法则,神器Arthas从CPU/内存出发轻松掌握调优实战技巧

    场景一、CPU过高 CPU占用过高排查思路: step1:进行arthas step2:输入deashboard 如何不记得命令可以在控制台输入help step3:查看线程栈信息 从线程栈信息中定位到具体的java代码。 场景二、内存占用过高 内存占用过高排查思路: step1:进行arthas step2:输入deashboard 在dashboard页面中

    2024年02月06日
    浏览(46)
  • 阿里巴巴达摩院通义千问【附申请链接】阿里版ChatGPT

    阿里云作为数一数二的全球云平台,阿里的大语言模型通义千问还是值得期待的,凭借强大的算力支持还是有机会赶上人工智能发展浪潮。 早前阿里巴巴达摩院关于人工智能机器人的研讨信息引起不少关注,当时达摩院也对比测试百度的文心一言。现在阿里巴巴自己的人工智

    2023年04月18日
    浏览(57)
  • 重磅一款极具潜力的开源免费数据库管理工具!

    最近看到一个冷门的数据库管理工具: slashbase 。 这个工具是开源免费的,由于开源不久,目前才900+的Star,但用下来还是非常不错的,DD觉得这款工具还是非常有潜力的,所以给大家推荐一下。 slashbase 有几个比较亮眼的功能,比如: 它提供了两种不同的管理方式,用户可以

    2024年02月14日
    浏览(87)
  • 我与阿里巴巴集团副总裁、阿里云智能数据库事业部总负责人在阿里云官网同框啦

    大家好,我是冰河~~ 今天周末,就暂时不发技术文章了。今天为大家分享一个对我个人来说,比较高兴的事情,就是我成为阿里云“大咖答”栏目下数据库专题的荣誉版主啦。 其实,更令我自豪的是我很荣幸与ACM杰出科学家,阿里巴巴集团副总裁、阿里云智能数据库事业部总

    2024年02月02日
    浏览(85)
  • 【阿里云镜像】更改阿里巴巴开源镜像站镜像源之——CentOS 7

    为了下载速度快,每次都要做好镜像的更改,既然次数多,懒得每次还来查资料,就自己写一篇博客加强自己的记忆。 阿里巴巴 OPSX 开源镜像站,提供 CentOS、Debian、Ubuntu、 Fedora、Arch Linux、Gentoo、openSUSE、Scientific Linux 等主流发行版的软件源镜像。为阿里云和互联网用户提供

    2024年02月05日
    浏览(74)
  • 三种方式在HTML使用阿里字体图标--iconfont阿里巴巴矢量图标库

    好久没用到阿里巴巴的图标,突然要用到就发现不会用了,只会导出png格式的图标png了= = 目录 1、字体图标 方法一、本地使用通过类名使用阿里矢量图标 1、把图标添加入库 2、把图标添加到项目  3、下载字体图标 4、使用文件 5、在对应的HTML页面上引入css 6、使用字体图标

    2024年02月16日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包