Java开源工具库使用之线上监控诊断库Arthas
文章目录
- 前言
- 一、介绍
- 1.1 功能
- 1.2 原理
- 二、安装使用
- 2.1 下载
- 2.2 使用
- 三、常用
- 3.1 实时查看
- 3.2 追踪查看
- 3.3 辅助命令
- 3.4 热更新
- 3.5 监控
- 四、实战
- 4.1 CPU/内存占用过高
- 4.2 接口耗时高
- 4.3 找到类所在jar
- 4.4 查找类的实例
- 4.5 生成火焰图
- 参考
前言
在现代软件开发中,应用程序的监控和调试是非常重要的环节。特别是在复杂的 Java 应用程序中,排查问题、优化性能和定位异常往往成为开发者的一项挑战。针对这个问题,阿里巴巴开发了一款强大而灵活的 Java 诊断工具,名为 Arthas 。
Arthas 框架被誉为"Java开发者的神器",它旨在帮助开发者实时监控和深入调试 Java 应用程序,提供了丰富的功能和便捷的操作。无论是在开发、测试还是生产环境中,Arthas 都能够以低侵入性的方式提供全面的应用程序观测和问题诊断能力。
- github: https://github.com/alibaba/arthas
- 官网:https://arthas.aliyun.com/
Arthas支持 JDK 6+,支持 Linux/Mac/Windows ,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断,当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从 JVM 内查找某个类的实例?
在本篇博文中,我们将全面介绍 Arthas 框架的基本概念和原理,详细探讨 Arthas 的常用操作以及如何使用它进行监控和调试。我们还将给出一些实际应用场景的示例,让读者能够更好地理解和运用 Arthas 来提升自己的 Java 开发调试能力。
一、介绍
1.1 功能
- 监控(Observability):Arthas 提供了实时监控 Java 应用程序运行状态和性能的功能。通过监控,开发者能够获得关键的运行指标,如方法调用、线程状态、堆栈跟踪等,从而可以全面了解应用程序的运行情况。
- 诊断(Diagnosis):Arthas 支持深入调试和诊断Java应用程序,帮助开发者定位和解决问题。开发者可以通过 Arthas 提供的命令行界面,进行方法追踪、变量修改、热替换等操作,以便更好地理解代码执行过程和解决潜在的问题。
- 命令行界面(Command-line Interface):Arthas 使用简洁而强大的命令行界面来操作和控制监控和诊断功能。开发者可以通过在命令行中输入特定的命令,来获取所需的监控数据、执行诊断操作或配置监控规则等。这种命令行交互的方式使得 Arthas 对于开发者来说非常方便和灵活。
总而言之,Arthas框架基于监控和诊断的概念,通过命令行界面,提供了实时监控和深入调试 Java 应用程序的能力。
1.2 原理
-
基于Java的 Instrumentation 机制和字节码增强技术:
-
Instrumentation 是 Java SE 5 引入的一个功能强大的 API,它允许开发者在运行时修改、替换或者重新定义字节码,而不用修改源代码。
-
Arthas利用Java的Instrumentation API,在目标应用程序的启动过程中动态加载字节码增强器。
-
字节码增强器负责对目标应用程序的类进行字节码修改和增强。
-
-
目标应用程序的运行时监控和诊断:
- Arthas的字节码增强器根据监控规则和命令行输入的指令,在目标应用程序的方法中插入自定义的代码逻辑。
- 插入的代码逻辑会在方法调用前后、异常抛出等关键点触发,实现对目标应用程序的监控和诊断。
-
动态代理技术:
- Arthas利用 Java 的动态代理技术,对目标对象进行包装,以便在方法执行前后添加额外的逻辑。
- 这样,Arthas 可以实现对目标对象的监控和诊断,无需修改目标对象的源代码。
Arthas的核心原理是利用Java的Instrumentation机制和字节码增强技术,在 目标应用程序运行时动态地修改和增强其字节码,从而实现对目标应用程序的监控和诊断功能。这种低侵入性的设计使得Arthas可以在不停止应用程序的情况下对其进行实时监控和调试,极大地提高了开发者的效率和调试能力。
二、安装使用
2.1 下载
curl -O https://arthas.aliyun.com/arthas-boot.jar
上面jar包,第一次启动后会接着下载所需依赖包,如果不成功可直接在github上下载完整包
2.2 使用
使用和目标进程一致的用户启动,否则可能 attach 失败
java -jar arthas-boot.jar
进入命令行界面,需要选择想追踪的 java 进程

三、常用
3.1 实时查看
通过Arthas进行全局 JVM,线程,方法调用和堆栈跟踪分析
-
使用
dashboard实时查看全局 JVM
-
获取实时线程的信息
thread 1 #找到主线程thread -n 3 # 找到当前最忙的3个线程thread -b # 找出当前阻塞其他线程的线程,只支持找出 synchronized 关键字阻塞住的线程thread --state # 查看指定状态的线程
-
在所有匹配的方法调用处打印方法参数、返回值和执行时间等信息。
trace demo.MathGame run trace com.example.MyClass *
-
watch
对函数执行数据观测,让你能方便的观察到指定函数的调用情况。能观察到的范围为:
返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。4 个观察事件点,即 -b 函数调用前,-e 函数异常后,-s 函数返回后,-f 函数结束后(默认)
# 查看运行方法超时的参数和返回结果 watch demo.MathGame primeFactors '{params, returnObj}' '#cost>0.03' -n 1
3.2 追踪查看
-
watch虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测,这时tt就可以发挥作用了,它能记录下当时方法调用的所有入参和返回值、抛出的异常可以通过tt -t 记录所有运行得方法,找到自己想要的,然后通过tt -i [index]查看具体参数,如果参数比较复杂,还可以通过-w 通过ognl表达式访问
tt -t demo.MathGame primeFactors tt -i 1008 tt -i 1008 -w 'params[0].obj'

字段 含义 IS-RET 方法是否以正常返回的形式结束 IS-EXP 方法是否以抛异常的形式结束
3.3 辅助命令
-
强制GC
vmtool --action forceGc -
重载方法
有时匹配方法会碰到重载方法,可通过下面OGNL表达式挑选
'params.length== 参数个数 && params[0] instanceof java.lang.String'
3.4 热更新
展示 Arthas 如何实现无需重启应用程序而进行热更新
retransform /path/to/new/class/file
# 显示替换的类
retransform -l
# 根据id删除
retransform -d 1
注意:
- 不允许新增加 field/method
- 正在跑的函数,没有退出不能生效
- 应该谨慎使用热更新,避免对系统稳定性和安全性产生负面影响
3.5 监控
使用monitor命令
# c 统计周期,默认值为 120 秒
monitor -c 5 demo.MathGame primeFactors "params[0] <= 2"

| 监控项 | 说明 |
|---|---|
| timestamp | 时间戳 |
| class | Java 类 |
| method | 方法(构造方法、普通方法) |
| total | 调用次数 |
| success | 成功次数 |
| fail | 失败次数 |
| rt | 平均 RT |
| fail-rate | 失败率 |
Arthas的监控功能灵活而强大,可以帮助开发人员及时发现和解决系统性能或行为问题。但需要注意的是,监控需要消耗一定的系统资源,因此应该合理设置监控规则,避免对系统产生额外的负担。
四、实战
4.1 CPU/内存占用过高
- 用
dashboard查看占用CPU最高的线程名字,然后通过thread ID查看具体线程信息 - 如果dashboard 面板的堆栈空间内存占用过多,可通过
heapdump heapdump.hprof导出dump文件,用MAT 或 jvisualvm 查看
4.2 接口耗时高
- 可通过
trace demo.MathGame primeFactors对应接口相关类和方法追踪 - 还可以通过
trace demo.MathGame primeFactors '#cost > 100'将筛选耗时 >100ms 的方法
4.3 找到类所在jar
使用sc -d命令:使用以下命令进行类的查找:
-
sc -d className其中,
className为待查找的类的全限定名,例如demo.MathGame。 -
查看结果:Arthas会输出类的相关信息,包括类所在的Jar包路径。在其中找到“code-source”一项,即可获得该类所在的Jar包路径。

注意事项:
- 如果类尚未被加载,那么无法通过
sc -d命令找到类所在的Jar包。 - 如果类存在于多个Jar包中,Arthas 将只显示一个匹配。如果需要找到所有匹配的Jar包,可以使用
sc -d className --deep命令进行深度查找。
4.4 查找类的实例
可以使用vmtool 获取实例
vmtool --action getInstances --className java.lang.String --limit 10

4.5 生成火焰图
开始采集:执行profiler start命令,开启性能分析。profiler 执行时间可以根据参数调整,如 --duration 10 --interval 500采样周期为500ms,持续10秒。
当命令执行完毕后,会在output目录下生成html文档,包含对应火焰图
此命令不支持windows
profiler start --duration 10 --interval 500

参考
- https://arthas.aliyun.com/doc/
- Arthas 看了官方文档还不会用?进来了解一哈~
相关文章:
Java开源工具库使用之线上监控诊断库Arthas
文章目录 前言一、介绍1.1 功能1.2 原理 二、安装使用2.1 下载2.2 使用 三、常用3.1 实时查看3.2 追踪查看3.3 辅助命令3.4 热更新3.5 监控 四、实战4.1 CPU/内存占用过高4.2 接口耗时高4.3 找到类所在jar4.4 查找类的实例4.5 生成火焰图 参考 前言 在现代软件开发中ÿ…...
Nodejs操作缓存数据库-Redis
Hi I’m Shendi Nodejs专栏 Nodejs操作缓存数据库-Redis 在服务端开发中,缓存数据库也是不可或缺的,可以提高程序并发以及方便后续扩展,而目前最常用的莫过于Redis了 安装依赖 和之前的mysql一样,redis的依赖最常用的就是redis …...
Springboot项目全局异常处理
1.ErrorCode.java package com.hng.config.exception.error;/*** Author: 郝南过* Description: TODO* Date: 2023/11/14 10:56* Version: 1.0*/ public interface ErrorCode {String getCode();String getMessage(); }2.ErrorEnum.java package com.hng.config.exception.er…...
算法笔记-第七章-栈的应用(未完成)
算法笔记-第七章-栈的应用 栈的基本常识栈的解释一栈的解释二 栈的操作序列合法的出栈序列可能的出栈序列补充知识点 后缀表达式(无优先级) 栈的基本常识 栈(Stack)是只允许在一端进行插入或删除操作的线性表。 栈的解释一 栈的…...
Linux socket编程(3):利用fork实现服务端与多个客户端建立连接
上一节,我们实现了一个客户端/服务端的Socket通信的代码,在这个例子中,客户端连接上服务端后发送一个字符串,而服务端接收到字符串并打印出来后就关闭所有套接字并退出了。 上一节的代码较为简单,在实际的应用中&…...
若依Linux与Docker集群部署
若依Linux集群部署 1. 若依2.MYSQL Linux环境安装2.1 MYSQL数据库部署和安装2.2 解压MYSQL安装包2.3 创建MYSQL⽤户和⽤户组2.4 修改MYSQL⽬录的归属⽤户2.5 准备MYSQL的配置⽂件2.6 正式开始安装MYSQL2.7 复制启动脚本到资源⽬录2.8 设置MYSQL系统服务并开启⾃启2.9 启动MYSQL…...
20.2 设备树中的 platform 驱动编写
一、设备树下的 platform 驱动 platform 驱动框架分为总线、设备和驱动,总线不需要我们去管理,这个是 Linux 内核提供。在有了设备树的前提下,我们只需要实现 platform_driver 即可。 1. 修改 pinctrl-stm32.c 文件 先复习一下 pinctrl 子系…...
C++实现ransac
目录 一、ransac算法原理 1.1、算法概念 1.2、图解 二、c实现ransac 2.1、设置随机样本和离群点 2.2、随机抽取样本 2.3、内点计算 2.4、更新参数 2.2、完整代码 一、ransac算法原理 1.1、算法概念 随机抽样一致性 (RANSAC) 是一种迭代方法,用于根据一组包…...
DNS域名解析服务
1.概述 1.1.产生原因 IP 地址:是互联网上计算机唯一的逻辑地址,通过IP 地址实现不同计算机之间的相互通信,每台联网计算机都需要通过I 地址来互相联系和分别,但由于P 地址是由一串容易混淆的数字串构成,人们很难记忆所有计算机的…...
【milkv】2、mpu6050驱动添加及测试
前言 本章介绍mpu6050的驱动添加以及测试。 其中驱动没有采用sdk提供的驱动,一方面需要配置irq,另一方面可以学习下如何通过ko方式添加驱动。 一、参考文章 驱动及测试文件编译流程: https://community.milkv.io/t/risc-v-milk-v-lsm6ds…...
SpringCloud Alibaba(中):服务熔断降级-Sentinel
Sentinel Sentinel是阿里巴巴开源的分布式系统流量防卫防护组件,主要对分布式系统中的流量进行控制、熔断降级等保护操作。Sentinel的目标是成为互联网级别分布式系统的流量防卫防护组件,它与系统的各个部分集成,保护着系统的入口和出口。 …...
模型的训练专题
训练目标在数学上指定了模型应该如何从训练数据中学习和获取能力。训练基础模型的当前现状涉及特定于模型的目标。我们设想,未来基础模型的训练目标将反映两个变化:从系统证据和评估中得出的原则性选择,以及跨数据源和模式提供丰富、可扩展和…...
深入解析 Azure 机器学习平台:架构与组成部分
Azure机器学习平台是Microsoft Azure提供的一种云上机器学习服务,为开发者和数据科学家提供了一个全面且易于使用的环境来创建、训练、部署和管理机器学习模型。本文将对Azure机器学习平台的基本架构和组成部分进行深入解析,帮助读者全面了解该平台的工作…...
使用百度语音识别技术实现文字转语音的Java应用
探讨如何使用百度语音识别技术将文字转换为语音的Java应用。百度语音识别技术是一种强大的语音识别服务,可以将输入的文字转换为自然流畅的语音输出。我们将使用Java编程语言来实现这个应用,并提供相应的源代码。 首先,我们需要准备一些前提…...
【C#学习】文件操作
文章目录 常见操作拷贝文件检测文件夹是否存在并创建判断文件是否存在删除文件夹下的所有文件保留文件夹获取指定目录下的所有文件名删除 常见操作 拷贝文件 System.IO.File.Copy(sourcePath, targetPath); 检测文件夹是否存在并创建 //if directory not exit,then establis…...
Chrome版本对应Selenium版本
1.获得浏览器版本号和驱动 浏览器版本: 119.0.6045.124 浏览器驱动版本: 119.0.6043.1 / 120.0.6051.0 访问 https://vikyd.github.io/download-chromium-history-version/ 2. 安装selenium pip install selenium4.1.1 -i http://pypi.mirrors.ustc.edu.cn/simple/ --trusted…...
Day29力扣打卡
打卡记录 美丽塔 II(前后缀分解 单调栈) 链接 大佬的题解 class Solution:def maximumSumOfHeights(self, a: List[int]) -> int:n len(a)suf [0] * (n 1)st [n] # 哨兵s 0for i in range(n - 1, -1, -1):x a[i]while len(st) > 1 and …...
java源码用到的设计模式
Java 中有许多常用的设计模式,它们是为了解决特定问题而被反复使用和验证的经验总结。以下是一些常见的 Java 设计模式: 创建型模式 工厂模式 (Factory Pattern): 提供一个创建对象的接口,但是由子类决定实例化哪个类。例如:java…...
high perfermance computer usage
简单记一下hpc的使用: hpc就是一些科研机构或者大学建立的服务器中心。我这大学的每一位学生,可以轻松使用hpc批量跑数据,也可以新建自己的server跑一些local data,后者每个学生账号最大是32核512G的运行内存,体验非常…...
51单片机+DS1302设计一个电子钟(LCD1602显示时间)
一、前言 电子钟是一种能够准确显示时间的设备,广泛应用于家庭、办公场所和公共场所,为人们提供了方便和准确的时间信息。本项目设计一个基于51单片机的电子钟,使用DS1302作为RTC时钟芯片,LCD1602作为显示屏,并通过串…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
