软件环境
问题背景
生产方法调用存在耗时长,通过日志无法定位耗时长的行(日志打印位置也不合理)。
实操
案例一:Kafka 消费客户端
说明:存在一个业务多个节点串行异步处理。
Step.1: 启动 arthas
java -jar arthas-boot.jar
Step.2: 选择应用(java 进程 id)
图只是个参考,实际是 jdk17。

Step.3: 方法执行链路追踪
trace com.***.crm.channel.dataSyn.service.impl.MssCloudInfoSyncServiceImpl pullDataFinish -n 5 --skipJDKMethod false

说明:限制追踪次数
Step.4: 停止对方法的追踪
案例二:SAAS 健康度定时任务
Step.1: 启动 arthas
Step.2: 选择应用(java 进程 id)
这里选择的是第二个应用:smet-rpc-service。
[tomcat@[ServerHost] arthas-4.1.3]$ ls arthas-agent.jar arthas-client.jar arthas.properties as.bat as.sh install-local.sh logback.xml arthas-boot.jar arthas-core.jar arthas-spy.jar as-service.bat async-profiler lib math-game.jar [tomcat@[ServerHost] arthas-4.1.3]$ ./as.sh Arthas script version: 4.1.3 [INFO] JAVA_HOME: /usr/lib/jvm/jdk-17-oracle-x64 Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. * [1]: 2031341 ops-portal.jar [2]: [PID] smet-rpc-service-1.0-SNAPSHOT.jar [3]: 88806 kafka-map.jar [4]: [PID] smet-rpc-service-1.0-SNAPSHOT.jar [5]: 103069 org.apache.zookeeper.server.quorum.QuorumPeerMain [6]: 103581 play.core.server.ProdServerStart 2 Arthas home: /app/arthas/arthas-4.1.3 Calculating attach execution time... Attaching to [PID] using version /app/arthas/arthas-4.1.3... real 0m2.328s user 0m0.500s sys 0m0.067s Attach success. telnet connecting to arthas server... current timestamp is [Timestamp] Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. ,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' | `--' `--'`--' '--' `--' `--'`--' `--'`-----' wiki https://arthas.aliyun.com/doc tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html version 4.1.3 main_class smet-rpc-service-1.0-SNAPSHOT.jar pid [PID] start_time 2025-12-12 16:00:12.425 current_time 2025-12-18 09:27:44.599 [arthas@[PID]]$
Step.3: 方法执行链路追踪
[arthas@[PID]]$ trace com.***.nctc.smet.job.promesaas.ClickHouseStatus3Count3Job execute Press Q or Ctrl+C to abort. Affect(class count: 1 , method count: 1) cost in 553 ms, listenerId: 9 `---ts=2025-12-18 09:46:00.245;thread_name=ClickHouseStatus3Count3Job2_Worker-1;id=258;is_daemon=false;priority=5;TCCL=jdk.internal.loader.ClassLoaders$AppClassLoader@7ad041f3 `---[44354.950448ms] com. ***.nctc.smet.job.promesaas.ClickHouseStatus3Count3Job:execute() [throws Exception] +---[0.00% 0.012141ms ] org.apache.shardingsphere.elasticjob.api.ShardingContext:getJobName()
说明:工具默认会将耗时最长的标红

Step.4: 停止对方法的追踪
stop com.***.nctc.smet.job.promesaas.ClickHouseStatus3Count3Job execute
Arthas 简介
Arthas 是一款由阿里巴巴开源的 Java 诊断工具,旨在帮助开发者高效排查线上应用问题。它通过无侵入的方式附着到运行中的 JVM 进程,提供实时监控和动态诊断能力,无需修改代码或重启应用即可完成问题定位。
该工具的核心功能包括:
- 全局视角监控:实时查看应用的负载、内存、GC、线程等状态信息,快速识别性能瓶颈。
- 方法级诊断:支持观察方法调用的入参、出参、异常和执行耗时,通过命令如
watch、trace 等深入分析业务逻辑。
- JVM 与类分析:提供类加载详情、线程堆栈、内存使用情况等,帮助定位类冲突、内存泄漏等问题。
- 热更新与调试:允许动态修改类字节码,实现热部署,并支持远程调试,减少线上服务中断时间。
Arthas 基于 Java Instrumentation 和 Attach 机制实现字节码增强,兼容 JDK 6 及以上版本,可在 Linux、Mac、Windows 等多平台使用。其命令行界面支持 Tab 补全和丰富的插件扩展,适用于 Spring Boot、Dubbo 等主流框架。
常用命令举例
查看类的加载情况
smap com.example.MyClass
查看 com.example.MyClass 类的加载信息,包括加载时机、来源等。
跟踪某个方法的调用
trace com.example.MyClass methodName
跟踪 com.example.MyClass 中 methodName 方法的每次调用。
查看堆内存使用情况
heapdump /path/to/heapdump.hprof
生成堆内存的转储文件,便于后续使用其他工具(如 MAT)进行分析。
实时修改类的方法
redefine /path/to/new/MyClass.class
替换 MyClass 的字节码,实现类的动态修改。
查看某个类的所有方法及其执行时间
watch com.example.MyClass methods -x 2
监控 com.example.MyClass 类中所有方法的执行时间,输出前两次执行的结果。
查看当前线程信息
thread
查看当前所有活跃的线程及其状态。
查看 JVM 信息
help
查看 Arthas 支持的命令列表。
注意事项
- 使用 Arthas 时,确保你有足够的权限来操作目标 Java 进程。
- 在生产环境中使用前,建议先在测试环境中验证命令的效果和安全性。
- 动态修改类和重新定义方法可能会带来不可预见的副作用,谨慎使用。
- Arthas 的安装和启动通常需要依赖 Java 环境,确保目标机器上已安装 Java 并配置了相应的环境变量。
通过上述命令和功能,Arthas 为 Java 开发者提供了一套强大的实时诊断和修复工具,极大地提升了开发和运维的效率。
参考资料