一款不可错过的Java应用诊断利器Arthas

 更新时间:2023年06月15日 08:25:42   作者:Cosolar  
Arthas是一款由阿里巴巴开源的Java应用诊断利器,它可以帮助开发人员在运行时对Java应用进行调试和诊断,解决线上问题,本文将简单的描述一下该工具的用法和常用命令,以勾起大家对此工具应用的兴趣

一、Arthas的介绍

Arthas是一款基于Java的命令行工具,可以在运行时对Java应用进行调试和诊断,其主要功能包括:实时查看JVM状态、方法调用链路追踪、监控系统资源消耗、动态修改代码等。

同时Arthas也是阿里巴巴开源的Java诊断工具,集成了较多的功能,包括进程状态查看、Java类、方法的查找和监控、异常信息分析、线程状态监控、JVM统计信息查看等。相比其他Java诊断工具,Arthas有以下几个优点:

  • 操作简单:只需要在目标机上执行一个脚本即可。
  • 功能强大:支持从线上诊断到本地诊断场景,并且能够解决大部分日常开发遇到的问题。
  • 方便快捷:可以动态修改代码,方便调试。
  • 支持多种使用方式:命令行使用方式、WebUI使用方式、telnet响应式命令行交互使用方式。
  • 针对Java应用的特征进行优化,包括注重性能、稳定性、安全性。
  • 多年在线大规模使用证明了Arthas的高性能、低影响性和实用性。

Arthas的安装非常简单,只需要通过Maven将其依赖添加到项目中即可:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>arthas-client</artifactId>
    <version>3.5.4</version>
</dependency>

二、Arthas的使用

1. 进入Arthas Shell

在使用Arthas之前,我们需要先进入Arthas Shell。可以通过以下命令进入:

./as.sh

出现如下界面即表示成功进入Arthas Shell:

$ as.sh
  / \  _   _ _ __ (_) ___| |__   ___ _ __ ___
 / _ \| | | | '_ \| |/ __| '_ \ / _ \ '__/ __|
/ ___ \ |_| | | | | | (__| | | |  __/ |  \__ \
\/   \/\__,_|_| |_|_|\___|_| |_|\___|_|  |___/
Welcome to Arthas, enjoy it. More info please visit: https://alibaba.github.io/arthas
$ _

2. 查看JVM状态

在Arthas Shell中,我们可以通过以下命令查看当前JVM的状态:

$ jvm

执行以上命令后,会输出类似于以下的信息:

[INFO] [arthas-jvm] [0.140s] [pid:5102] [user:binjie] [hostname:localhost.localdomain] [cwd:/home/binjie] [command:/usr/lib/jvm/java-8-oracle/bin/java -jar /home/binjie/demo/target/demo-1.0-SNAPSHOT.jar] [args:] [state:RUNNING] [os:Linux 4.18.0-147.5.1.el8_1.x86_64 amd64] [Java home:/usr/lib/jvm/java-8-oracle]

其中,我们可以看到当前JVM的进程ID、用户、主机等信息。

3. 方法调用链路追踪

有时我们需要查看某个方法被调用了多少次、被哪些方法调用了,甚至是每一次调用的参数和返回值。这时可以使用Arthas的trace命令。以下是一些常用的示例:

(1)追踪某个方法的所有调用

$ trace com.example.demo.service.UserService getUserById

这条命令将会追踪com.example.demo.service.UserService类中的getUserById方法的所有调用。

(2)追踪某个类中所有方法的调用

$ trace com.example.demo.service.UserService

这条命令将会追踪com.example.demo.service.UserService类中的所有方法调用。

(3)追踪某个方法的详细信息

$ trace com.example.demo.service.UserService getUserById -n 5

这条命令将会追踪com.example.demo.service.UserService类中的getUserById方法的前5次调用,并打印出每次调用的参数和返回值。

4. 监控系统资源消耗

在Arthas Shell中,我们可以通过以下命令监控系统资源的消耗情况:

(1)监控CPU占用率

$ dashboard

执行以上命令后,会输出一个监控面板,其中包含了CPU占用率、Java线程数、内存使用情况等信息。

(2)监控线程

$ thread

执行以上命令后,会输出当前JVM中所有线程的信息。

(3)监控GC

$ gc

执行以上命令后,会输出GC的相关信息。

5. 动态修改代码

Arthas还支持在运行时动态修改代码,以下是一些常用的示例:

(1)修改某个类的某个方法的返回值

$ redefine com.example.demo.service.UserService getUserById "return \"Hello Arthas!\";"

这条命令将会修改com.example.demo.service.UserService类中的getUserById方法的返回值为"Hello Arthas!"

(2)添加某个类的某个方法

$ redefine -c com.example.demo.service.UserService -m addUser --params-string "java.lang.String name, java.lang.Integer age" "logger.info(\"addUser invoked! name:{} age:{}\", name, age); return true;"

这条命令将会在com.example.demo.service.UserService类中添加一个名为addUser的方法,并且该方法的参数为String nameInteger age,最后将会输出日志并返回true

6. 其他常用命令

除了以上的命令之外,Arthas还有许多其他的实用命令,以下列举一些常用的:

(1)查看方法调用次数

$ sc -d 3 com.example.demo.service.UserService getUserById

这条命令将会查看com.example.demo.service.UserService类中的getUserById方法在最近的3秒钟内被调用的次数。

(2)查看线程堆栈

$ thread -i [线程ID]

这条命令将会输出指定ID的线程的堆栈信息。

(3)查看类的加载情况

$ classloader -c com.example.demo.service.UserService

这条命令将会查看com.example.demo.service.UserService类的加载情况。

三、 连接应用

使用 Arthas 前需要先连接到相应的 Java 应用程序,Arthas 支持两种连接方式:默认连接和 Telnet 连接。

1. 默认连接

默认连接是指 Arthas 自动连接当前机器上正在运行的 Java 应用程序。可以通过以下命令启动默认连接:

$ java -jar arthas-boot.jar

启动后会自动连接当前机器上正在运行的 Java 应用程序。

$ java -jar arthas-boot.jar --target-ip 127.0.0.1 --telnet-port 3658

启动后会尝试连接指定的 IP 地址和端口号上的 Java 应用程序。

2. Telnet 连接

Telnet 连接是指通过 Telnet 协议连接到 Java 应用程序。可以通过以下命令启动 Telnet 连接:

$ telnet 127.0.0.1 3658

连接成功后可以输入 help 命令查看 Arthas 的帮助信息。

四、小结一下

Arthas就像是Java应用程序的救世主,它会让你在调试过程中不再感到“纠结”和“郁闷”,而是变成“顺风顺水”和“乐在其中”。使用Arthas,你可以轻松地查看JVM信息、调用链追踪、方法监控等等,就像使用神奇的魔棒一样。使得你在调试过程中可以开开心心地喝着茶、说着笑话,并且在芝士多多的群里大显身手,展现你的技术实力和幽默感。Arthas就是你成功找到Bug的必备良药,让我们一起来拥抱这个优秀的工具吧!

以上就是一款不可错过的Java应用诊断利器Arthas的详细内容,更多关于Java应用诊断利器Arthas的资料请关注脚本之家其它相关文章!

相关文章

  • Java 超详细讲解hashCode方法

    Java 超详细讲解hashCode方法

    在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致
    2022-04-04
  • 使用Feign配置请求头以及支持Https协议

    使用Feign配置请求头以及支持Https协议

    这篇文章主要介绍了使用Feign配置请求头以及支持Https协议,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • javaweb 国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

    javaweb 国际化:DateFormat,NumberFormat,MessageFormat,ResourceBu

    本文主要介绍javaWEB国际化的知识,这里整理了详细的资料及实现代码,有兴趣的小伙伴可以参考下
    2016-09-09
  • Guava本地缓存的使用过程

    Guava本地缓存的使用过程

    文章介绍了使用Guava和Redis实现二级缓存的原因,以及如何通过Guava作为一级缓存,Redis作为二级缓存来减少数据库压力,提高缓存的可靠性,同时,通过一个具体示例说明了如何在微服务场景中使用Guava和Redis进行二级缓存,最后,总结了Guava的参数机制
    2025-01-01
  • java 字符串内存分配的分析与总结(推荐)

    java 字符串内存分配的分析与总结(推荐)

    下面小编就为大家带来一篇java 字符串内存分配的分析与总结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • IDEA中配置多个版本的JDK的实现示例

    IDEA中配置多个版本的JDK的实现示例

    IDEA可以配置多个JDK,根据需要使用不同版本的,本文就来介绍一下IDEA中配置多个版本的JDK的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Java int与integer的对比区别

    Java int与integer的对比区别

    这篇文章主要介绍了Java int与integer的对比区别的相关资料,需要的朋友可以参考下
    2017-01-01
  • SpringBoot实现MD5加盐算法的示例代码

    SpringBoot实现MD5加盐算法的示例代码

    加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • Java爬虫框架之WebMagic实战

    Java爬虫框架之WebMagic实战

    这篇文章主要介绍了Java爬虫框架之WebMagic实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java深入探究Object类的方法

    Java深入探究Object类的方法

    java继承中说到的Object类是java中一个特殊的类,所有的类都是直接或者间接的继承自Object类,即如果某个类没有使用extends关键字则默认是java.lang.Object类的子类,所以所有的类都可以使用Object类中定义的方法,下面介绍Object类的常用方法
    2022-05-05

最新评论