一款不可错过的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的资料请关注脚本之家其它相关文章!

相关文章

  • activiti获取流程图实例

    activiti获取流程图实例

    这篇文章主要介绍了activiti获取流程图的方法,需要的朋友可以参考下
    2014-08-08
  • Java接收text/event-stream格式数据的详细代码

    Java接收text/event-stream格式数据的详细代码

    这篇文章主要介绍了java接收text/event-stream格式数据,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • SpringMVC拦截器配置及运行流程解析

    SpringMVC拦截器配置及运行流程解析

    这篇文章主要介绍了SpringMVC拦截器配置及运行流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 详谈Java中instanceof和isInstance的区别

    详谈Java中instanceof和isInstance的区别

    下面小编就为大家带来一篇详谈Java中instanceof和isInstance的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • SpringBoot项目中读取resource目录下的文件六种方法

    SpringBoot项目中读取resource目录下的文件六种方法

    这篇文章给大家总结了SpringBoot项目中读取resource目录下的文件六种方法,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2024-05-05
  • Java利用Hutool-Script封装JS脚本执行

    Java利用Hutool-Script封装JS脚本执行

    在 Java 开发中,有时需要动态执行脚本代码,比如 JavaScript 脚本,来实现一些灵活的业务逻辑,下面我们就来看看如何利用Hutool-Script模块对Java的脚本执行功能进行封装吧
    2025-02-02
  • java arrayList遍历的四种方法及Java中ArrayList类的用法

    java arrayList遍历的四种方法及Java中ArrayList类的用法

    arraylist是动态数组,它具有三个好处分别是:动态的增加和减少元素 、实现了ICollection和IList接口、灵活的设置数组的大小,本文给大家介绍java arraylist遍历及Java arraylist 用法,感兴趣的朋友一起学习吧
    2015-11-11
  • Spring Security Oauth2.0 实现短信验证码登录示例

    Spring Security Oauth2.0 实现短信验证码登录示例

    本篇文章主要介绍了Spring Security Oauth2.0 实现短信验证码登录示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java集合框架源码分析之LinkedHashMap详解

    Java集合框架源码分析之LinkedHashMap详解

    这篇文章主要介绍了Java集合框架源码分析之LinkedHashMap详解,内容包括了linkedhashmap的简介和源码剖析以及关于LinkedHashMap的源码总结,内容丰富,需要的朋友可以参考下。
    2017-09-09
  • 教你Spring Cloud保证各个微服务之间调用安全性

    教你Spring Cloud保证各个微服务之间调用安全性

    在微服务的架构下,系统会根据业务拆分为多个服务,各自负责单一的职责,在这样的架构下,我们需要确保各api的安全性,今天通过本文给大家分享Spring Cloud中如何保证各个微服务之间调用的安全性,需要的朋友参考下吧
    2021-08-08

最新评论