目录

简介

Arthas 特点

安装 Arthas

通过 curl 安装

 脚本安装方式

 使用 Arthas

选择 Java 进程

基本命令

高级命令

 使用帮助命令

实战应用场景

监控方法执行时间

观察方法参数

查看方法调用堆栈

动态更新类

命令列表

jvm 相关

class/classloader 相关

monitor/watch/trace 相关

总结


简介

        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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐