news 2026/4/26 2:45:28

arthas

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
arthas

Arthas(阿尔萨斯)是阿里巴巴开源的一款Java 诊断工具,它可以帮助开发者在不修改代码、不重启服务的前提下,对运行中的 Java 应用进行实时诊断、调试、监控和问题排查

下面我会从你关心的两个层面来讲解 Arthas 提供的机制,并提供简单、全面、便于上手的例子:


一、Arthas 提供的核心机制(功能)

1.实时查看 JVM 信息

  • 查看线程状态(thread
  • 查看内存使用(memory
  • 查看系统属性、类加载器等(syspropsysenvclassloader

✅ 举例:thread -n 3查看 CPU 占用最高的 3 个线程堆栈

2.动态监控方法调用(核心功能)

  • trace:追踪方法内部调用路径和耗时
  • watch:观察方法参数、返回值、异常
  • monitor:统计方法调用次数和耗时
  • tt(TimeTunnel):记录方法历史调用,可回放

✅ 举例:

watchcom.example.service.UserService getUser"params, returnObj"-x3

监控getUser方法的入参和返回值,对象展开 3 层。

3.动态修改运行时行为(高级调试)

  • ognl:执行任意 OGNL 表达式(比如调用静态方法、修改静态变量)
  • redefine/retransform:热更新字节码(需配合外部 class 文件)

✅ 举例:

ognl'@com.example.Config@ENABLE_DEBUG=true'

动态开启某个配置开关。

4.反编译运行中的类

  • jad:反编译指定类,查看实际加载的字节码对应的源码(尤其用于排查 AOP、代理、Lombok 生成代码)

✅ 举例:

jad com.example.service.UserService

5.在线诊断 & 火焰图

  • 集成 async-profiler,生成火焰图(profiler start
  • 查看热点方法、CPU 瓶颈

二、Arthas IDEA 插件(Arthas Plugin)

功能目标:

让开发者在 IDEA 中直接生成 Arthas 命令,无需手敲复杂语法。

提供机制:

  1. 右键生成命令
    • 在方法上右键 →ArthasWatch / Trace / Monitor→ 自动生成命令
  2. 命令预览与复制
    • 自动填充类名、方法名、参数表达式
  3. 与远程 Arthas 控制台联动(需手动粘贴执行)

📌 注意:IDEA 插件不直接连接 Arthas,它只是“命令生成器”。实际执行仍需在终端 attach 到目标进程。

安装方式:

  • 打开 IDEA →SettingsPlugins→ 搜索Arthas IDEA→ 安装并重启

三、一个完整的小例子(热更新配置 + 监控)

假设你有一个动态配置类:

@ComponentpublicclassDynamicConfig{publicvolatilebooleanenableSqlLog=false;}

使用 Arthas 动态开启 SQL 日志:

  1. 启动应用,记下 PID(比如 12345)

  2. 启动 Arthas:

    java -jar arthas-boot.jar12345
  3. 执行 OGNL 修改配置:

    ognl'#config=@com.example.DynamicConfig@com.example.DynamicConfig, #config.enableSqlLog=true'

    (实际需根据 Spring 获取 bean 的方式调整,也可通过 Spring Context 获取)

  4. watch验证是否生效:

    watchcom.example.mapper.UserMapper selectById'{params, #config.enableSqlLog}'-v

四、适用场景总结

场景Arthas 机制
线上 CPU 100%thread -n 5+profiler
方法返回值不对watch
想知道方法哪一步慢trace
怀疑 Lombok 生成有问题jad反编译
想动态开启调试开关ognl修改 static/field
不想重启改日志级别结合ognl+ 日志框架配置类

五、注意事项

  • 生产环境慎用redefineognl修改状态可能带来副作用。
  • 需 Java agent 权限:部分环境(如 Docker、K8s)需开放 attach 权限。
  • 不支持 JDK 21+ 的某些新特性(截至 Arthas 3.7.x)。

为什么设计出来
!我们来从设计初衷、监控目标、监控机制、实战 Demo四个层面,深入浅出地讲清楚 Arthas 为什么被设计出来,以及它是如何工作的。


一、为什么设计 Arthas?—— 起源与痛点

线上生产环境中,Java 应用一旦部署,通常:

  • 不能停机(高可用要求)
  • 不能随意加日志(日志膨胀、性能影响)
  • 不能远程 Debug(安全限制、网络隔离)

但开发者又经常遇到:

  • “为什么这个接口突然变慢了?”
  • “这个方法到底有没有被调用?”
  • “传入的参数是不是有问题?”
  • “Lombok 生成的代码到底长什么样?”

传统方式要么重启加日志,要么抓线程栈+猜,效率极低。

🎯Arthas 的设计目标
在不重启、不修改代码、不侵入业务的前提下,对运行中的 JVM 应用进行实时观测与诊断。

它本质上是一个JVM 诊断代理(Java Agent),利用Instrumentation + ASM + OGNL等技术,在运行时动态注入监控逻辑。


二、有什么东西要监控?—— 常见监控目标

监控维度具体内容Arthas 命令
线程CPU 飙高?死锁?阻塞?thread
内存堆内存、GC 情况memory,gc
方法调用谁调了我?参数对吗?耗时多少?返回值是什么?watch,trace,monitor,tt
类加载类是否加载?从哪个 ClassLoader?classloader,sc
源码结构实际运行的字节码对应的源码(含代理、Lombok)jad
执行表达式动态修改配置、调用方法ognl
性能分析热点函数、CPU 火焰图profiler

三、怎么监控?—— 核心机制简述

Arthas 通过Java Agent机制 attach 到目标 JVM 进程,然后:

  1. 动态增强(Instrumentation)
    使用ASM修改目标类的字节码,在方法入口/出口插入监控代码(比如记录参数、时间、返回值)。

  2. 表达式求值(OGNL)
    支持在运行时执行任意表达式,访问/修改任意字段、调用方法。

  3. 交互式命令行
    提供 telnet/WebConsole 交互界面,实时下发指令。

✅ 举个比喻:
Arthas 就像给运行中的 Java 程序装了一个“内窥镜 + 遥控器”——既能看内部状态,又能临时调控。


四、实战 Demo —— 5 分钟上手

我们模拟一个典型场景:线上接口突然变慢,但本地无法复现

步骤 1:准备一个 Spring Boot 示例应用

@RestControllerpublicclassDemoController{@GetMapping("/user/{id}")publicUsergetUser(@PathVariableLongid){// 模拟耗时操作try{Thread.sleep(id*10);// id 越大越慢}catch(InterruptedExceptione){Thread.currentThread().interrupt();}returnnewUser(id,"user-"+id);}}recordUser(Longid,Stringname){}

启动后,访问http://localhost:8080/user/100会明显变慢。

步骤 2:启动 Arthas

# 下载 arthas-boot.jar(只需一次)curl-O https://arthas.aliyun.com/arthas-boot.jar# 假设你的 Spring Boot PID 是 12345java -jar arthas-boot.jar12345

选择你的应用进程,进入 Arthas 控制台。

步骤 3:监控方法调用(核心 Demo)

🎯 目标 1:看谁在调用getUser,参数是什么?
watchcom.example.demo.DemoController getUser"{params[0], returnObj}"-x2

访问/user/200,Arthas 输出:

ts=2025-12-25 17:30:00; [cost=2008ms] @Object[][ @Long[200], @User[ id=@Long[200], name=@String[user-200] ] ]

✅ 一眼看出:传入 id=200,耗时 2008ms,返回对象完整结构。


🎯 目标 2:追踪耗时在哪?
trace com.example.demo.DemoController getUser

输出:

`---ts=2025-12-25 17:31:00; [cost=2005ms] `---com.example.demo.DemoController.getUser() [2005ms] `---java.lang.Thread.sleep(Native Method) [2000ms]

✅ 明确看到:99% 时间花在Thread.sleep上!


🎯 目标 3:动态修改行为(临时修复)

假设我们想临时禁止大 ID 访问(比如 id > 100),但又不能改代码。

先用jad看源码(确认类名):

jad com.example.demo.DemoController

然后通过 OGNL 注入逻辑(需结合 Spring Context,简化版):

实际中可通过ognl获取 Spring Bean 并修改其内部状态,或配合 AOP 拦截。

(此处略复杂,但说明:Arthas 能让你“动态编程”


步骤 4:退出 & 清理

stop# 退出 Arthas,不影响原应用

原应用继续运行,无任何侵入


五、总结:Arthas 的核心价值

传统方式Arthas 方式
加日志 → 重启 → 复现 → 查日志直接 attach,实时 watch
jstack 看线程,猜问题thread -b直接找死锁
反编译 jar 看源码jad直接看运行时类
无法知道方法内部调用链trace一键输出耗时链路

💡Arthas 不是监控系统(如 Prometheus),而是“在线 Debugger + Profiler”


如果你正在用 Spring Boot + MyBatis + Redis,Arthas 还能:

  • watchMyBatis Mapper 方法,看 SQL 参数
  • traceRedis 操作,查连接超时
  • ognl动态开关 MyBatis 二级缓存
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 22:59:47

E-Hentai-Downloader:轻松下载图片资源的强大工具

E-Hentai-Downloader:轻松下载图片资源的强大工具 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader E-Hentai-Downloader 是一个专门用于从特定网站下载图片资…

作者头像 李华
网站建设 2026/4/24 2:32:20

Dify如何组织复杂的知识点讲解顺序?

Dify如何组织复杂的知识点讲解顺序? 在AI应用开发日益普及的今天,一个普遍的挑战浮出水面:如何让非技术背景的产品经理、运营人员甚至初学者,也能清晰理解一个由大模型驱动的智能系统是如何工作的?更进一步&#xff0c…

作者头像 李华
网站建设 2026/4/23 10:42:30

MOSFET栅极电压作用机制通俗解释

深入理解MOSFET栅极电压:它是如何“无中生有”地控制电流的?你有没有想过,一个小小的电压信号,是如何在不直接参与电流流动的情况下,精准地“指挥”几安培甚至几十安培的大电流通断的?这听起来像魔法&#…

作者头像 李华
网站建设 2026/4/22 16:39:28

PotPlayer字幕翻译插件配置:3步轻松搞定外语视频观看

还在为看不懂外语视频的字幕而烦恼吗?PotPlayer字幕翻译插件让你轻松解决这一难题。通过翻译API,这款插件能够实时翻译视频字幕,支持多种语言互译,让外语视频观看变得简单愉快。本文将手把手教你如何配置这款实用的字幕翻译工具。…

作者头像 李华
网站建设 2026/4/20 2:45:11

Dify在十四行诗创作中的艺术成就评述

Dify在十四行诗创作中的艺术成就评述 在数字人文与人工智能交汇的今天,诗歌——这一曾被视为人类灵魂独白的语言艺术高地,正悄然迎来一场静默而深刻的变革。当“算法能否写诗”不再是一个哲学设问,而是可被调试、编排甚至优化的技术命题时&am…

作者头像 李华
网站建设 2026/4/22 7:31:41

Colorama 使用教程

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而…

作者头像 李华