目录
简介
Arthas 特点
安装 Arthas
通过 curl 安装
脚本安装方式
使用 Arthas
选择 Java 进程
基本命令
高级命令
使用帮助命令
实战应用场景
监控方法执行时间
观察方法参数
查看方法调用堆栈
动态更新类
命令列表
jvm 相关
class/classloader 相关
monitor/watch/trace 相关
总结
Arthas 是一款开源的 Java 诊断工具,由阿里巴巴开源,用于帮助开发者排查 Java 应用程序的性能问题和故障。它可以无需修改应用程序代码,实时监控和分析 Java 应用程序,并提供丰富的命令和功能,如查看方法执行耗时、查看类加载情况、动态修改方法内容等
官网:arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
通过 curl 下载 Arthas 的启动器,然后运行 jar 文件。
wget -O as.sh https://arthas.aliyun.com/as.sh
chmod +x as.sh
./as.sh
# 查看 Java 进程列表
ps aux | grep java
# 连接到指定的 Java 进程
arthas
# 查看 Java 线程栈信息
thread
# 查看方法执行时间
profiler start
profiler stop
profiler summary
# 监控方法调用
watch com.example.demo.service.* 'params,returnObj'
# 查看类加载情况
classloader
# 动态修改方法
mc -c <类名> -m <方法名> --watch
# 修改方法体
mc -c <类名> -m <方法名> --set-return-value 'newValue'
# 查看帮助文档
help
# 查看具体命令的帮助信息
help
# 连接到 Java 进程
arthas
# 启动方法执行时间监控
profiler start
# 模拟执行操作(访问应用接口、触发服务方法等)
# 停止方法执行时间监控
profiler stop
# 查看方法执行耗时排行
profiler summary
假设我们有一个类 com.example.service.UserService 中的方法 getUserById,接受一个参数 userId:
package com.example.service;
public class UserService {
public String getUserById(Long userId) {
// 实现方法逻辑
return "User" + userId.toString();
}
}
在 Arthas 中执行以下步骤来观察 getUserById
方法的参数:
arthas
watch com.example.service.UserService getUserById '{params,returnObj}'
#这条命令将观察 com.example.service.UserService 类中的 getUserById 方法,显示该方法的参数 (params) 和返回值 (returnObj)。当调用 getUserById 方法时,Arthas 将输出参数和返回值的信息。
#例如,如果调用 getUserById(123) 方法:
Press Ctrl + C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 28 ms.
ts=2023-10-10 10:10:10; [INFO] result: User123
jad命令后面跟一个全路径类名,可以查看class文件的代码情况,这个很常用,比如说我们改了代码在生产环境上发现不生效,就可以用这个命令查看自己的代码是否是修改过的。
jad com.eoi.streaming.service.dataset.FilterTemplateService filterTemplateDao
# 通过 redefine 命令重新定义类
redefine -c com.example.service.UserService -b /path/to/modified/UserService.class
-c com.example.service.UserService
表示要重定义的类名,-b /path/to/modified/UserService.class
表示提供用于重定义的修改后的 UserService.class
文件的路径
注意:使用redefine时需要提供已经修改过的类的字节码文件。修改后的类文件应该与原始类具有相同的名称和包结构。并且在重定义类时,需要确保类加载器能够访问到修改后的类文件。此外,重新定义类可能会破坏类的一致性,应该小心谨慎地使用。
.java
文件为.class
文件.class
文件,redefine 到 JVM 里.class
文件,retransform 到 JVM 里注意
请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop
或将增强过的类执行 reset
命令。
Arthas 是一个功能强大的 Java 诊断工具,它能够帮助开发者在生产环境中实时诊断和定位 Java 应用程序的问题。通过本文介绍的安装和应用场景,希望能够帮助读者更好地了解和使用 Arthas 工具。
更多用法请阅读官方文档:快速入门 | arthas