0

0

什么是Arthas(阿尔萨斯)_阿里开源的Java在线诊断神器快速入门教程

P粉602998670

P粉602998670

发布时间:2026-03-10 12:14:01

|

284人浏览过

|

来源于php中文网

原创

arthas 是线上 java 进程的实时诊断“手术刀”,核心连入命令为 java -jar arthas-boot.jar;它自动扫描本地 java 进程,支持 docker 内进程(需进入容器操作),watch 用于观察方法结果,trace 用于分析调用链耗时,ognl 需指定 classloader 才能访问应用类,诊断后务必 quit 或 shutdown 清理 agent。

什么是arthas(阿尔萨斯)_阿里开源的java在线诊断神器快速入门教程

Arthas 不是“远程调试器”,也不是“JVM监控面板”,它是你线上 Java 进程出问题时,能直接连上去、实时看、动态改、马上验证的手术刀。

怎么连上正在跑的 Java 进程

核心就一条命令:java -jar arthas-boot.jar。它会自动扫描本机所有 Java 进程,列出 PID 和主类,选一个回车就行。别手贱去翻文档找 as.sharthas-client —— 那些是旧版或特殊场景用的,arthas-boot.jar 是当前唯一推荐入口。

  • 如果进程在 Docker 里,得先 docker exec -it <container> /bin/bash</container>,再把 arthas-boot.jar 拷进去(或挂载卷),不能直接在宿主机上扫到容器内进程
  • 非 root 用户启动的 Java 进程,arthas-boot.jar 可能因权限不足 attach 失败,报错 Unable to open socket file,这时候要么切到对应用户执行,要么加 JVM 参数 -Djdk.attach.allowAttachSelf=true(JDK 8u191+)
  • 连上后提示符变成 [arthas@12345]$,这个 12345 就是目标进程 PID,不是 Arthas 自己的 PID

watchtrace 到底该用哪个

watch 看的是方法执行后的结果(返回值、入参、异常),trace 看的是方法内部调用链耗时。两者定位问题的方向完全不同:前者适合“结果不对”,后者适合“怎么这么慢”。

  • watch com.example.service.UserService login '{params,returnObj,throwExp}' -n 5:只抓最近 5 次调用的入参、返回值、异常,不卡线程
  • trace com.example.controller.OrderController createOrder:默认只显示耗时 > 1ms 的调用,想看全部得加 -n 5 --skipJDK(跳过 JDK 内部方法,不然全是 String.valueOf
  • 别对高频方法(比如 toString()hashCode())用 trace,容易把目标进程拖垮;watch 也建议加 -n 限流,否则日志刷屏还可能 OOM

为什么 ognl 执行老是报 class not found

Arthas 的 ognl 命令是在目标 JVM 的上下文中执行的,但它默认只加载 bootstrap 和 system classloader 的类,应用自己的类(比如 Spring Bean、自定义工具类)得手动指定 classloader。

Beautiful.ai
Beautiful.ai

AI在线创建幻灯片

下载

立即学习Java免费学习笔记(深入)”;

  • 先用 sc -d *User* 查到类全名和对应的 ClassLoader hash,比如输出里有 classLoaderHash: 0x3f4a76c5
  • 再用 ognl -c 0x3f4a76c5 '@com.example.util.DateUtils@now()'-c 参数必须带,否则找不到类
  • Spring Bean 不能直接 @Autowired,得先通过 ApplicationContext 获取:ognl -c 0x3f4a76c5 '#context=@org.springframework.context.ApplicationContext@getBean("userMapper")'
  • OGNL 表达式里别写复杂逻辑,它不支持 lambda、try-catch,连三元运算符都容易解析失败

退出和清理比你想象中更重要

Arthas 不是“连上就完事”,它会在目标 JVM 中注入 agent,长期挂着可能影响 GC、占用内存、甚至干扰某些字节码增强框架(比如 Byte Buddy)。每次诊断完,务必执行 quitshutdown

  • quit:断开当前终端连接,agent 还在 JVM 里,下次还能连
  • shutdown:彻底卸载 agent,释放资源,JVM 恢复“干净”状态
  • 如果终端异常断开(比如网络中断、Ctrl+C),Arthas 通常能自动清理,但遇到 JDK 8u191 以下版本或某些国产 JDK,可能残留 agent,得重启应用
  • 别在生产环境反复 attach/detach 同一个进程——有些老版本 JDK 有 attach 次数限制,试多了会直接拒绝后续连接

真正难的从来不是“怎么用命令”,而是判断哪条命令在哪个时机下不会让系统更糟。连之前先看 GC 日志,watch 之前先 sc 确认类存在,ognl 之前先 -c 指定 classloader——这些不是步骤,是条件反射。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

155

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1564

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

241

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

128

2025.10.17

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

128

2025.10.17

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

215

2023.09.15

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 80万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号