Arthas 工具介绍与实战
目录
简介
Arthas 是一款开源的 Java 诊断工具,由阿里巴巴开源,用于帮助开发者排查 Java 应用程序的性能问题和故障。它可以无需修改应用程序代码,实时监控和分析 Java 应用程序,并提供丰富的命令和功能,如查看方法执行耗时、查看类加载情况、动态修改方法内容等
官网:arthas
Arthas 特点
- 动态诊断:可以在不重启应用的情况下实时诊断问题。
- 丰富命令:提供了丰富的命令和选项,用于监控、调试和诊断 Java 应用。
- 简单易用:友好的命令行交互界面,对开发者友好。
安装 Arthas
-
通过 curl 安装
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
使用 Arthas
-
选择 Java 进程
# 查看 Java 进程列表
ps aux | grep java
# 连接到指定的 Java 进程
arthas <PID>
-
基本命令
# 查看 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 <command>
实战应用场景
监控方法执行时间
# 连接到 Java 进程
arthas <PID>
# 启动方法执行时间监控
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 <PID>
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时需要提供已经修改过的类的字节码文件。修改后的类文件应该与原始类具有相同的名称和包结构。并且在重定义类时,需要确保类加载器能够访问到修改后的类文件。此外,重新定义类可能会破坏类的一致性,应该小心谨慎地使用。
命令列表
jvm 相关
- dashboard - 当前系统的实时数据面板
- getstatic - 查看类的静态属性
- heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
- jvm - 查看当前 JVM 的信息
- logger - 查看和修改 logger
- mbean - 查看 Mbean 的信息
- memory - 查看 JVM 的内存信息
- ognl - 执行 ognl 表达式
- perfcounter - 查看当前 JVM 的 Perf Counter 信息
- sysenv - 查看 JVM 的环境变量
- sysprop - 查看和修改 JVM 的系统属性
- thread - 查看当前 JVM 的线程堆栈信息
- vmoption - 查看和修改 JVM 里诊断相关的 option
- vmtool - 从 jvm 里查询对象,执行 forceGc
class/classloader 相关
- classloader - 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource
- dump - dump 已加载类的 byte code 到特定目录
- jad - 反编译指定已加载类的源码
- mc - 内存编译器,内存编译
.java
文件为.class
文件 - redefine - 加载外部的
.class
文件,redefine 到 JVM 里 - retransform - 加载外部的
.class
文件,retransform 到 JVM 里 - sc - 查看 JVM 已加载的类信息
- sm - 查看已加载类的方法信息
monitor/watch/trace 相关
注意
请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop
或将增强过的类执行 reset
命令。
- monitor - 方法执行监控
- stack - 输出当前方法被调用的调用路径
- trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时
- tt - 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
- watch - 方法执行数据观测
总结
Arthas 是一个功能强大的 Java 诊断工具,它能够帮助开发者在生产环境中实时诊断和定位 Java 应用程序的问题。通过本文介绍的安装和应用场景,希望能够帮助读者更好地了解和使用 Arthas 工具。
更多用法请阅读官方文档:快速入门 | arthas
更多推荐
所有评论(0)