⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 juejin.cn/post/7244471654508281916 「Cosolar」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

Arthas是一款由阿里巴巴开源的Java应用诊断利器,它可以帮助开发人员在运行时对Java应用进行调试和诊断,解决线上问题。具体详细使用请参考官方文档,本文将简单的描述一下该工具的用法和常用命令,以勾起大家对此工具应用的兴趣。

官方文档: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)修改某个类的某个方法的返回值

$ 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 连接。

2.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.2 Telnet 连接

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

$ telnet 127.0.0.1 3658

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

四、小结一下

Arthas就像是Java应用程序的救世主,它会让你在调试过程中不再感到“纠结”和“郁闷”,而是变成“顺风顺水”和“乐在其中”。使用Arthas,你可以轻松地查看JVM信息、调用链追踪、方法监控等等,就像使用神奇的魔棒一样。

使得你在调试过程中可以开开心心地喝着茶、说着笑话,并且在芝士多多的群里大显身手,展现你的技术实力和幽默感。Arthas就是你成功找到Bug的必备良药,让我们一起来拥抱这个优秀的工具吧!

文章目录
  1. 1. 一、Arthas的介绍
  2. 2. 二、Arthas的使用
    1. 2.0.0.1. 1. 进入Arthas Shell
    2. 2.0.0.2. 2. 查看JVM状态
    3. 2.0.0.3. 3. 方法调用链路追踪
    4. 2.0.0.4. 4. 监控系统资源消耗
    5. 2.0.0.5. 5. 动态修改代码
    6. 2.0.0.6. 6. 其他常用命令
  • 3. 三、 连接应用
    1. 3.0.0.1. 2.1 默认连接
    2. 3.0.0.2. 2.2 Telnet 连接
  • 4. 四、小结一下