Arthas 使用攻略

目录

背景

Arthas是什么?

安装

使用arthas-boot(推荐)

启动

常用命令

一键生成arthas命令的插件(强烈推荐)

watch

一、命令语法结构

二、核心参数详解

三、实战场景

1. 基础观测 - 查看入参和返回值

2. 条件过滤 - 只关注特定参数

3. 异常捕获 - 定位NPE根源

4. 耗时监控 - 组合#cost变量

5. 对象深挖 - 追踪集合内部数据

6. 链式观测 - 结合OGNL表达式

jad

一、命令语法结构

二、核心参数详解

三、实战场景

1. 基础用法 - 反编译整个类

2. 过滤方法 - 只反编译特定方法

3. 源码对比 - 确认生产环境代码版本

trace

一、核心功能原理

二、核心参数矩阵

三、实战场景

1. 基础耗时分析

2. 条件过滤分析

3. 多层调用链路展开

4. 异步线程追踪

5. 重载方法区分

6. 异常路径追踪


背景

通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。

开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。

如果在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。

Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。

Arthas是什么?

阿里巴巴开源的Java诊断工具Arthas(阿尔萨斯)是一款全能的运行时诊断神器,具备三大核心优势:

  • 零侵入:无需重启应用或修改代码
  • 全维度:支持方法级监控、类加载追踪、热修复等
  • 可视化:提供命令行交互和Web Console两种操作方式

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

安装

使用arthas-boot(推荐)

下载arthas-boot.jar

curl -O https://arthas.aliyun.com/arthas-boot.jar

启动

java -jar的方式启动

java -jar arthas-boot.jar

启动后如图:


常用命令

一键生成arthas命令的插件(强烈推荐)

watch


Arthas的watch命令是动态观测方法调用数据的核心工具,能够实时捕获方法的入参、返回值、异常信息,是诊断代码逻辑问题的利器。

一、命令语法结构
watch 类全路径 方法名 "{观测表达式}" [条件过滤] [参数选项]
  • 观测表达式:OGNL语法,支持多维度数据组合
  • 条件过滤'#cost>50'(耗时>50ms才触发)
  • 参数选项:控制观测行为(-b/-e/-x等)
二、核心参数详解

参数

作用

示例

-b

观察方法调用前(Before)的状态

watch *Service login -b

-e

观察方法异常时(Exception)的堆栈

watch *Dao query -e

-s

观察方法返回后(Success)的结果

watch *Util parse -s

-x

指定对象展开层级(默认1层)

-x 3

(深入3层)

-n

最大捕获次数(避免无限输出)

-n 5

(只显示5次)

三、实战场景
1. 基础观测 - 查看入参和返回值
watch com.example.UserService getUserById "{params,returnObj}" -x 2

👉 输出示例:

@ArrayList[@Object[][@Long[12345],  // 参数1: userId=12345],@User{          // 返回值id=12345,name="张三",age=30}
]

2. 条件过滤 - 只关注特定参数
watch *OrderService createOrder 'params[0] > 1000' 'params[0].amount > 1000' -x 3

👉 当订单金额amount超过1000时触发观测


3. 异常捕获 - 定位NPE根源
watch com.example.DataParser parse "{params,throwExp}" -e -x 2

👉 输出异常堆栈:

throwExp : java.lang.NullPointerException: Cannot read field "id"at com.example.DataParser.parse(DataParser.java:23)...

4. 耗时监控 - 组合#cost变量
watch com.alibaba.dubbo.Provider invoke '#cost > 200' -n 3

👉 只显示执行耗时超过200ms的调用,最多捕获3次


5. 对象深挖 - 追踪集合内部数据
watch *UserDAO batchInsert '{params[0].![name], returnObj.size}" -x 4

👉 观测传入的用户名列表和插入后的记录数
👉 ![name]表示遍历集合获取name属性


6. 链式观测 - 结合OGNL表达式
watch *ConfigLoader load "{ #map={ 'key1':params[0], 'result':returnObj } }" -x 3

👉 自定义数据结构,将入参和返回值封装成Map输出

jad

Arthas的jad命令是实时反编译JVM加载类的利器,能快速查看内存中的字节码对应的Java源码,是排查类冲突、验证代码版本的必备工具。

一、命令语法结构
jad [--source-only] 类全路径 [方法名]
  • 内存级反编译:直接读取JVM中的Class字节码
  • 无需源码:即使生产环境没有源代码也能查看逻辑
  • 动态验证:检查热更新后的代码是否生效
  • 支持过滤:可指定反编译单个方法
二、核心参数详解

参数

作用

使用场景

--source-only

仅显示Java源码(去除类加载信息)

快速查看核心逻辑

--lineNumber

显示行号(需LocalVariableTable存在)

定位异常堆栈具体行

--methodName

反编译指定方法

过滤复杂类的大方法

--classLoaderClass

指定ClassLoader进行反编译

多ClassLoader环境精准定位


三、实战场景
1. 基础用法 - 反编译整个类
jad com.example.UserService# 输出示例
ClassLoader: jdk.internal.loader.ClassLoaders$AppClassLoader@2c13b15
Location: file:/app.jarpublic class UserService {public User getUserById(Long id) {return userDao.query(id);}...
}

2. 过滤方法 - 只反编译特定方法

jad com.example.ConfigLoader loadConfig# 输出指定方法的反编译结果

3. 源码对比 - 确认生产环境代码版本

jad --source-only com.alibaba.dubbo.config.ProtocolConfig# 对比本地代码,检查是否有热修复或不同版本

trace

Arthas的trace命令是方法调用链路追踪神器,专门用于分析代码执行路径中各子调用的耗时分布,快速定位性能瓶颈。以下从核心原理到高阶用法全面解析:


一、核心功能原理
trace [选项] 类全路径 方法名 [条件表达式]
  • 火焰图式分析:展示方法内部调用链的树状结构
  • 耗时统计:精确到每个子调用的耗时占比
  • 智能过滤:通过条件表达式筛选需要监控的调用
  • 动态插桩:基于字节码增强技术实现无侵入分析

二、核心参数矩阵

参数

作用

示例

-n

最多监控次数(防刷屏)

-n 5

(只显示5次结果)

#cost

耗时过滤条件(单位ms)

'#cost > 200'

--skipJDK

跳过JDK原生方法调用

--skipJDK false

-E

正则匹配增强(类+方法)

-E com.example.*Service

--list-class

显示可追踪的类列表

配合-E

使用


三、实战场景
1. 基础耗时分析
trace com.example.OrderService createOrder

👉 输出示例:

java复制
+---+--------+--------------+---------+-------+------+
|#  |耗时占比 |    调用方法    | 调用次数 | 总耗时 | 平均 |
+---+--------+--------------+---------+-------+------+
|1  | 45.3%  | UserDAO.query |    3    | 340ms | 113ms|
|2  | 32.1%  | Redis.set     |    5    | 241ms | 48ms |

2. 条件过滤分析
trace *UserService getUserById '#cost > 50' -n 3

👉 只显示单次调用总耗时超过50ms的请求,最多捕获3次


3. 多层调用链路展开
trace -E com.example.*Controller.* -j 3

👉 监控所有Controller类方法,展开3层调用深度


4. 异步线程追踪
trace --skipJDK=false java.util.concurrent.FutureTask get

👉 追踪线程池异步任务执行情况(需关闭JDK跳过)


5. 重载方法区分
trace com.example.Utils 'parse' params.length==2

👉 只监控有两个参数的parse重载方法


6. 异常路径追踪
trace com.example.PaymentService pay 'throwExp!=null'

👉 仅捕获出现异常的支付调用路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冥想类短视频批量剪辑自动混剪技术实践:从素材处理到智能合成全解析

一、引言:工业化内容生产的技术突围 在心理健康类内容爆发的当下,冥想类短视频凭借「低制作成本 高用户粘性」的特性成为热门赛道。本文结合实战经验,解析如何通过模块化素材处理、参数化合成引擎、自动化质量控制等技术手段,构…

【自定义控件实现最大高度和最大宽度实现】

背景 开发中偶尔遇到控件宽度或者高度在自适应的情况下,有个边界值,也就是最大值。 比如高度自适应的情况下最大高度300dp这种场景。 实现 关键节点代码: Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)…

综合练习三

使用到的知识点:xml文件,初始化file数据,提取file文件数据 题目:水文检测系统 备注:可以把序号作为该条数据的唯一标识(即UUID),而不是第一条第二条数据这样的类型。代码是后者&…

Microsoft Entra ID 详解:现代身份与访问管理的核心

Microsoft Entra ID(原名为 Azure Active Directory,简称 Azure AD)是微软推出的云端身份和访问管理服务,专为现代混合环境设计,支持企业安全地管理用户身份、控制资源访问,并集成多种应用与服务。以下从核心功能到最佳实践全面解析 Entra ID。 1. Entra ID 的核心定位 …

从技术角度看Facebook的隐私保护机制

在数字化时代,隐私保护成为了公众关注的焦点。作为全球最大的社交网络平台之一,Facebook 在隐私保护方面采取了一系列技术措施。本文将从技术角度探讨 Facebook 的隐私保护机制,揭示它是如何在提供个性化服务的同时,确保用户隐私信…

基于策略模式实现灵活可扩展的短信服务架构

基于策略模式实现灵活可扩展的短信服务架构 引言 在企业级应用开发中,短信服务是不可或缺的基础功能之一。随着业务发展,我们可能需要接入多个短信服务提供商(如阿里云、腾讯云、第三方短信网关等),并能够在不修改核…

Vue 3 单文件组件中 VCA 语法糖及核心特性详解

在 Vue.js 的开发世界里,单文件组件(Single File Components,简称 SFC)是构建复杂应用的基石。它将 HTML、CSS 和 JavaScript 代码封装在一个.vue文件中,极大地提高了代码的可维护性和复用性。 本文将深入探讨单文件组…

【Unity C#从零到精通】项目深化:构建核心游戏循环、UI与动态敌人系统

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

SNR8016语音模块详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 三、程序设计 main文件 usart.h文件 usart.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 SNR8016语音模块是智纳捷科技生产的一种离线语音识别模块,设计适合用于DIY领域,开放用户设…

「动态规划」线性DP:最长上升子序列(LIS)|编辑距离 / LeetCode 300|72(C++)

概述 DP,即动态规划是解决最优化问题的一类算法,我们要通过将原始问题分解成规模更小的、相似的子问题,通过求解这些易求解的子问题来计算原始问题。 线性DP是一类基本DP,我们来通过它感受DP算法的奥义。 最长上升子序列&#x…

【NumPy完全指南】从基础操作到高性能计算实战

📑 目录 一、NumPy核心价值1.1 科学计算现状分析1.2 ndarray设计哲学 二、核心数据结构解析2.1 ndarray内存布局2.2 数据类型体系 三、矢量化编程实践3.1 通用函数(ufunc)示例3.2 广播机制图解 四、高性能计算进阶4.1 内存预分配策略4.2 Cython混合编程 五、典型应用…

你的项目有‘哇‘点吗?

你的项目有哇点吗? 刷了一下午招聘软件,发现没?大厂JD里总爱写有创新力者优先——可你们的简历,创新力还不如食堂菜单! 程序员写项目最大的误区:把创新当彩蛋藏最后!什么参与需求评审负责模块…

2025年危化品安全员考试题库及答案

一、单选题 126.安全生产监督管理部门和负有安全生产监督管理职责的有关部门逐级上报事故情况,每级上报的时间不得超过()小时。 A.2 B.6 C.12 答案:A 127.按照《安全生产法》规定,危险化学品生产经营单位的从业人员不服从管理,违反安全生…

第十六届蓝桥杯 C/C++ B组 题解

做之前的真题就可以发现,蓝桥杯特别喜欢出找规律的题,但是我还是低估了官方的执念。本博客用于记录第一次蓝桥的过程,代码写的很烂,洛谷已经有的题解,这里不再赘述,只说自己遇到的问题。用于以后回顾和查找…

C++ 基于多设计模式下的同步异步⽇志系统-2项目实现

⽇志系统框架设计 1.⽇志等级模块:对输出⽇志的等级进⾏划分,以便于控制⽇志的输出,并提供等级枚举转字符串功能。 ◦ OFF:关闭 ◦ DEBUG:调试,调试时的关键信息输出。 ◦ INFO:提⽰,普通的提⽰…

提示词工程(GOT)把思维链推理过程图结构化

Graph of Thoughts(GOT)? 思维图(Graph of Thoughts)是一种结构化的表示方法,用于描述和组织模型的推理过程。它将信息和思维过程以图的形式表达,其中节点代表想法或信息,边代表它们…

登录github失败---解决方案

登录github失败—解决方案 1.使用 Microsoft Edge 浏览器 2.https://www.itdog.cn/dns/ 查询 github.global.ssl.fastly.net github.com 两个 域名的 IP 3.修改DNS 为 8.8.8.8 8.8.4.4 4.修改windows hosts 文件 5. 使用 Microsoft Edge 浏览器 打开github.com

Spring AOP概念及其实现

一、什么是AOP 全称Aspect Oriented Programming,即面向切面编程,AOP是Spring框架的第二大核心,第一大为IOC。什么是面向切面编程?切面就是指某一类特定的问题,所以AOP也可以称为面向特定方法编程。例如对异常的统一处…

强化学习_Paper_2017_Curiosity-driven Exploration by Self-supervised Prediction

paper Link: ICM: Curiosity-driven Exploration by Self-supervised Prediction GITHUB Link: 官方: noreward-rl 1- 主要贡献 对好奇心进行定义与建模 好奇心定义:next state的prediction error作为该state novelty 如果智能体真的“懂”一个state,那…

spring中的@Configuration注解详解

一、概述与核心作用 Configuration是Spring框架中用于定义配置类的核心注解,旨在替代传统的XML配置方式,通过Java代码实现Bean的声明、依赖管理及环境配置。其核心作用包括: 标识配置类:标记一个类为Spring的配置类,…