arthas-阿里远程诊断工具神器一定要掌握

文章目录

  • 1. 背景介绍
  • 2. 安装下载
  • 3. 常用命令
  • 4. 常见案例
    • 4.1 案例一:使用logger 实时修改某个类的日志级别、
    • 4.2 案例二:使用watch 查看方法输入输出参数
    • 4.3 案例三:使用 Arthas 实现在线代码热更新

1. 背景介绍

通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。

Arthas(阿尔萨斯)能为你做什么?
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到 JVM 的实时运行状态?
怎么快速定位应用的热点,生成火焰图?
怎样直接从 JVM 内查找某个类的实例?

2. 安装下载

官方文档:https://arthas.aliyun.com/doc/

本文在docker容器背景下操作

查看是否安装curlwhich curlcurl --version
下载curl -O https://arthas.aliyun.com/arthas-boot.jarwget https://arthas.aliyun.com/arthas-boot.jar
启动java -jar arthas-boot.jar

在这里插入图片描述

3. 常用命令

详见:https://arthas.aliyun.com/doc/commands.html

jvm 相关dashboard - 当前系统的实时数据面板getstatic - 查看类的静态属性heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能jvm - 查看当前 JVM 的信息logger - 查看和修改 loggermemory - 查看 JVM 的内存信息ognl - 执行 ognl 表达式perfcounter - 查看当前 JVM 的 Perf Counter 信息sysenv - 查看 JVM 的环境变量sysprop - 查看和修改 JVM 的系统属性thread - 查看当前 JVM 的线程堆栈信息vmoption - 查看和修改 JVM 里诊断相关的 optionvmtool - 从 jvm 里查询对象,执行 forceGc
class/classloader 相关classloader - 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResourcedump - dump 已加载类的 byte code 到特定目录jad - 反编译指定已加载类的源码mc - 内存编译器,内存编译.java文件为.class文件redefine - 加载外部的.class文件,redefine 到 JVM 里retransform - 加载外部的.class文件,retransform 到 JVM 里sc - 查看 JVM 已加载的类信息sm - 查看已加载类的方法信息
monitor/watch/trace 相关monitor - 方法执行监控stack - 输出当前方法被调用的调用路径trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时tt - 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测watch - 方法执行数据观测
基础命令base64 - base64 编码转换,和 linux 里的 base64 命令类似cat - 打印文件内容,和 linux 里的 cat 命令类似cls - 清空当前屏幕区域echo - 打印参数,和 linux 里的 echo 命令类似grep - 匹配查找,和 linux 里的 grep 命令类似help - 查看命令帮助信息history - 打印命令历史keymap - Arthas 快捷键列表及自定义快捷键pwd - 返回当前的工作目录,和 linux 命令类似quit - 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响reset - 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类session - 查看当前会话的信息stop - 关闭 Arthas 服务端,所有 Arthas 客户端全部退出tee - 复制标准输入到标准输出和指定的文件,和 linux 里的 tee 命令类似version - 输出当前目标 Java 进程所加载的 Arthas 版本号

PS: 靠,好像没有ls、ll、touch类似的linux命令,不方便!

重点:logger、sc、watch 、mc、refine

4. 常见案例

4.1 案例一:使用logger 实时修改某个类的日志级别、

# 1. logger查看指定类的日志级别
logger --name com.nimbus.messagecenter.service.impl.MessageSendServiceImpl
不支持:*.MessageSendServiceImpl# 2. sc 命令查看 JVM 加载的类信息【目的是获取classLoaderHash】
sc -d com.nimbus.messagecenter.service.impl.MessageSendServiceImpl
支持:sc -d *MessageSendServiceImpl# 3. logger 命令修改指定类的日志级别
logger -c 7daf6ecc --name com.nimbus.messagecenter.service.impl.MessageSendServiceImpl --level debug 

在这里插入图片描述
在这里插入图片描述

4.2 案例二:使用watch 查看方法输入输出参数

target : the object
clazz : the object's class
method : the constructor or method
params : the parameters array of method
params[0..n] : the element of parameters array
returnObj : the returned object of method
throwExp : the throw exception of method
isReturn : the method ended by return
isThrow : the method ended by throwing exception
#cost : the execution time in ms of method invocation

查看入参: watch com.nimbus.messagecenter.service.impl.MessageSendServiceImpl sendMessage params

查看返回值:watch *MessageSendServiceImpl sendMessage returnObj

查看异常: watch *MessageSendServiceImpl sendMessage throwExp

在这里插入图片描述

4.3 案例三:使用 Arthas 实现在线代码热更新

# 1. 使用 sc 命令查找 JVM 加载的类信息
sc -d *MessageSendServiceImpl
# 2. 使用 jad 命令反编译已加载类的源码
jad --source-only com.nimbus.messagecenter.service.impl.MessageSendServiceImpl > MessageSendServiceImpl.java
# 3. 修改改文件代码【但是docker容器中没有vim编辑器,草】
# 4. 使用 mc 内存编译.java文件为.class文件
mc -c 7daf6ecc MessageSendServiceImpl.java  -d /tmp
# 5. 使用 redefine 加载外部的.class文件
redefine /tmp/MessageSendServiceImpl.class

在这里插入图片描述

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

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

相关文章

文件上传、amrkdown编辑器

一、文件上传 这里我以图片为例,进行上传,上传到阿里云oss(对象存在中) 首先,我们先梳理一下,图片上传的流程 1、前端选择文件,提交文件 前端提交文件,我们可以使用ElementUI中的…

蓝队技能-应急响应篇Web内存马查杀JVM分析Class提取诊断反编译日志定性

知识点: 1、应急响应-Web内存马-定性&排查 2、应急响应-Web内存马-分析&日志 注:传统WEB类型的内存马只要网站重启后就清除了。 演示案例-蓝队技能-JAVA Web内存马-JVM分析&日志URL&内存查杀 0、环境搭建 参考地址:http…

有关 签到/签退 业务逻辑 的梳理与学习

导言 最近搞到了个签到管理,其中的业务逻辑感觉有点复杂(可能是我的方向不对),虽然是实现了,不过代码和逻辑很多,也有些乱,想趁着还记得逻辑来记录梳理一下,看看自己以后有没有更好的思路,或者有大佬有思路…

[C#]winform 使用opencvsharp实现玉米粒计数

【算法介绍】 这段代码是使用OpenCvSharp库(OpenCV的C#封装)对图像进行处理,主要流程包括图像的二值化、腐蚀操作、距离变换、轮廓检测,并在原图上标出检测到的轮廓位置及数量。下面是对代码的详细解读: 初始化&…

Ubuntu22.04安装GNSS数据处理软件GAMIT/GLOBK

由于微信公众号改变了推送规则,为了每次新的推送可以在第一时间出现在您的订阅列表中,记得将本公众号设为星标或置顶喔~ 手把手带您安装gamit/globk软件~ 🌿前言 受朋友之托,出一期Ubuntu22.04安装GNSS数据处理软件——gamit软件…

【论文笔记】Are Large Kernels Better Teacheres than Transformers for ConvNets

Abstract 本文提出蒸馏中小核ConvNet做学生时,与Transformer相比,大核ConvNet因其高效的卷积操作和紧凑的权重共享,使得其做教师效果更好,更适合资源受限的应用。 用蒸馏从Transformers蒸到小核ConvNet的效果并不好,原…

MySQL篇(存储过程 触发器 存储函数)(持续更新迭代)

目录 一、存储过程 1. 简介 2. 特点 3. 语法 3.1. 创建 3.2. 调用 3.3. 查看 3.4. 删除 4. 示例 二、变量 1. 简介 2. 系统变量 2.1. 查看系统变量 2.2. 设置系统变量 2.3. 演示示例 3. 用户定义变量 3.1. 赋值 方式一 方式二 3.2. 使用 3.3. 演示示例 4.…

Rust - 字符串:str 与 String

在其他语言中,字符串通常都会比较简单,例如 “hello, world” 就是字符串章节的几乎全部内容了。 但是Rust中的字符串与其他语言有所不同,若带着其他语言的习惯来学习Rust字符串,将会波折不断。 所以最好先忘记脑中已有的关于字…

华为---代理ARP简介及示例配置

目录 1. 概念 2. 前提条件 3. 使用环境 4. 工作过程 5. 优点 6. 缺点 7. 示例配置 7.1 示例场景 7.2基本配置 7.3 配置端口隔离 7.4 开启代理ARP 7.4.1 VLAN内代理ARP 7.4.2 VLAN间代理ARP 7.4.3路由式ARP代理 1. 概念 代理ARP(Proxy ARP)&…

C#使用实体类Entity Framework Core操作mysql入门:从数据库反向生成模型

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

matlab恢复默认窗口布局

1.点击主页,选择布局 2.选择默认,即可恢复到默认的窗口布局

LIN总线CAPL函数—— 设置LIN报文字节间隔长度(linSetInterByteSpace)

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

利士策分享,如何培养良好的工作习惯?

利士策分享,如何培养良好的工作习惯? 在这个快节奏、高压力的职场环境中,培养良好的工作习惯不仅关乎个人职业发展的顺畅度, 更是提升工作效率、保持身心健康的关键。 以下是一些实用的建议,帮助你在日常工作中逐步构…

智慧水利采砂船在线监控平台:构建高效、智能的河道采砂监管体系

随着科技的不断发展,水利行业的智慧化转型也日益受到重视。智慧水利采砂船在线监控平台便是这一转型的重要成果之一。该平台主要服务于水政执法人员,针对取得河道采砂许可证的采砂公司及采砂船,实施在线自动监控,旨在提高监管效率…

iptables限制网速

1、使用hashlimit来限速 #从eth0网卡进入INPUT链数据,使用模块hashlimit 限制网速为100kb/s或2mb/s,超过限制的数据包会被DROP。OUTPUT链同理,mode为srcip,有4个mode选项: srcip(默认匹配每个源地址IP,配置指定源地址…

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【上篇】

【STM32开发笔记】移植AI框架TensorFlow【上篇】 一、TFLM是什么?二、TFLM开源项目2.1 下载TFLM源代码2.2 TFLM基准测试说明2.3 TFLM基准测试命令 三、TFLM初步体验3.1 PC上运行Keyword基准测试3.2 PC上运行Person detection基准测试3.3 No module named numpy问题解…

保障电气安全的电气火灾监控系统主要组成有哪些?

电气火灾是什么? 电气火灾一般是指由于电气线路、用电设备、器具以及供配电设备出现故障性释放的热能:如高温、电弧、电火花以及非故障性释放的能量;如电热器具的炽热表面,在具备燃烧条件下引燃本体或其他可燃物而造成的火灾&…

递归基础训练-路径总和

路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 我们可以把之前的…

计算机组成原理(笔记4)

定点加减法运算 补码加法&#xff1a; 补码减法&#xff1a; 求补公式&#xff1a; 溢出的概念 在定点小数机器中,数的表示范围为|&#xff58;|<1。在运算过程中如出现大于1的现象,称为 “溢出”。 上溢&#xff1a;两个正数相加&#xff0c;结果大于机器所能表示的最…

数据结构-线性表的单链式存储结构图解及C语言实现

概念 链式存储&#xff1a;结点在存储器中的位置是任意的&#xff0c;即逻辑相邻的数据元素在物理上不一定相邻 链式存储结构也称非顺序映像或链式映像 图解 链式存储结构中结点一般有两个部分组成&#xff0c;即数据域(data)和指针域&#xff0c;数据域是用于存放数据的&…