一款不可错过的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简单链接Oracle数据库 注册和登陆功能的实现代码

    JAVA简单链接Oracle数据库 注册和登陆功能的实现代码

    这篇文章主要介绍了JAVA链接Oracle并实现注册与登录功能的代码实例,有需要的朋友可以参考一下
    2014-01-01
  • 解决restlet client报错No response.Is the certificate valid? Click here to check.

    解决restlet client报错No response.Is the cer

    这篇文章主要介绍了解决restlet client报错No response.Is the certificate valid? Click here to check.问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 如何解决Mybatis-plus中@TableLogic注解失效问题

    如何解决Mybatis-plus中@TableLogic注解失效问题

    这篇文章主要介绍了如何解决Mybatis-plus中@TableLogic注解失效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 关于Nacos配置管理的统一配置管理、自动刷新详解

    关于Nacos配置管理的统一配置管理、自动刷新详解

    这篇文章主要介绍了关于Nacos配置管理的统一配置管理、自动刷新详解,Nacos是阿里的一个开源产品,是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案,需要的朋友可以参考下
    2023-05-05
  • SpringBoot中MyBatis使用自定义TypeHandler的实现

    SpringBoot中MyBatis使用自定义TypeHandler的实现

    本文主要介绍了SpringBoot中MyBatis使用自定义TypeHandler,当默认的类型映射不能满足需求时,自定义 TypeHandler 就非常有用,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • SpringBoot整合UEditor的示例代码

    SpringBoot整合UEditor的示例代码

    本篇文章主要介绍了SpringBoot整合UEditor的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • mybatis中返回主键一直为1的问题

    mybatis中返回主键一直为1的问题

    这篇文章主要介绍了mybatis中返回主键一直为1的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java创建数组的3种方式代码举例

    Java创建数组的3种方式代码举例

    数组是相同类型数据的有序集合,数组描述的是若干个相同类型的数据按照一定的先后次序排列组合而成,其中每一个数据称为数组的元素,可以通过下标进行访问,这篇文章主要给大家介绍了关于Java创建数组的3种方式,需要的朋友可以参考下
    2024-01-01
  • java实现的冒泡排序算法示例

    java实现的冒泡排序算法示例

    这篇文章主要介绍了java实现的冒泡排序算法,结合实例形式分析了冒泡排序算法的具体操作步骤与实现技巧,需要的朋友可以参考下
    2017-01-01
  • java实现二分法查找出数组重复数字

    java实现二分法查找出数组重复数字

    这篇文章主要为大家详细介绍了java实现二分法查找出数组重复数字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11

最新评论