Arthas,生产问题大杀器
👉 这是一个或许对你有用的社群
🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:
《项目实战(视频)》:从书中学,往事上“练” 《互联网高频面试题》:面朝简历学习,春暖花开 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题 《精进 Java 学习指南》:系统学习,互联网主流技术栈 《必读 Java 源码专栏》:知其然,知其所以然
👉这是一个或许对你有用的开源项目
国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。
功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:
Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud 视频教程:https://doc.iocoder.cn 【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本
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>
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/
二、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
类的加载情况。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/yudao-cloud 视频教程:https://doc.iocoder.cn/video/
三、 连接应用
使用 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的必备良药,让我们一起来拥抱这个优秀的工具吧!
欢迎加入我的知识星球,全面提升技术能力。
👉 加入方式,“长按”或“扫描”下方二维码噢:
星球的内容包括:项目实战、面试招聘、源码解析、学习路线。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
微信扫码关注该文公众号作者