Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
Arthas是一款由阿里巴巴开源的Java应用诊断利器,它可以帮助开发人员在运行时对Java应用进行调试和诊断,解决线上问题。具体详细使用请参考官方文档,本文将简单的描述一下该工具的用法和常用命令,以勾起大家对此工具应用的兴趣。
官方文档:https://arthas.aliyun.com/
一、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)修改某个类的某个方法的返回值shell
$ 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 name和Integer 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 连接。
3.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 应用程序。
3.2 Telnet 连接
Telnet 连接是指通过 Telnet 协议连接到 Java 应用程序。可以通过以下命令启动 Telnet 连接:
$ telnet 127.0.0.1 3658
连接成功后可以输入 help 命令查看 Arthas 的帮助信息。
四、小结一下
Arthas就像是Java应用程序的救世主,它会让你在调试过程中不再感到“纠结”和“郁闷”,而是变成“顺风顺水”和“乐在其中”。使用Arthas,你可以轻松地查看JVM信息、调用链追踪、方法监控等等,就像使用神奇的魔棒一样。
使得你在调试过程中可以开开心心地喝着茶、说着笑话,并且在芝士多多的群里大显身手,展现你的技术实力和幽默感。Arthas就是你成功找到Bug的必备良药,让我们一起来拥抱这个优秀的工具吧!
福利:
扫码回复【图书】可免费领取图书管理系统源码