Arthas 日常记录

一 . 前言

Arthas 是一个 Java 诊断程序 , Arthas 官方 已经很详细的描述了命令的使用 , 如果想整体学习可以查看.

而这一篇文档记录了从最开始接触到 Arthas 到逐步深入过程中的一些记录和感悟 , 整理成文档以便处理.

使用场景

  • 如果是一个可以复现的线上问题,而代码中又无法看出为什么会出现这样的问题
  • 如果你先追踪线上的实际运行情况,在线上 debug 代码逻辑
  • 如果你想直接介入线上代码的运行,并且对线上代码进行热更新

二. 入门使用

// 官方文档 @ https://arthas.aliyun.com/doc/quick-start.html// Step 1 :下载官方 JAR 
wget https://arthas.aliyun.com/arthas-boot.jar// Step 2 : 启动 arthas
java -jar arthas-boot.jar// Step 3 : 选择对应的Java 进程 (PS : 启动后会显示所有的进程)// Step 4 : 输入 dashboard , 查看当前进程信息// 补充 : 其他主要的参数
- 通过thread命令来获取到MainClass : thread 1 | grep 'main('
- 通过 jad 反编译 : jad demo.MathGame
- 通过watch命令来查看返回值 : watch demo.MathGame primeFactors returnObj    

三. 命令整理

请添加图片描述

请添加图片描述

四. 问题梳理

4.1 ClassLoader 在其中的作用

在很多命令中都涉及到 classLoader , 我们可以通过 classLoader 先获取到 hash 码 ,再查询具体的参数

// 查看 classLoader 
classloader -l// 在查看对象的时候通过 classLoader 获取对象
getstatic -c 3d4eac69 ClassName methodName
mc -c 327a647b /tmp/Test.java >> 通过 ClassLoader 加载

总结

Arthas 的初始操作不多 ,更多的应该是基于实际问题的处理,后续文章会陆续往这个方向思考。

附录:常见使用方式

n.1 展示当前系统实时运行情况

通过运行 dashboard 命令即可查看当前系统的运行情况 , 有如下核心参数 :

在这里插入图片描述

n.2 Thread 进程获取函数信息

// 显示最忙的3个线程
> thread -n 2// 显示当前运行的线程
> thread
> thread all// 显示指定线程ID的线程
> thread 543// 指定时间间隔
> thread -n 3 -i 1000// 查看指定状态的线程 
> thread --state WAITING// 查找当前阻塞的线程
thread -b

n.3 jad 反编译代码

// 反编译指定类路径 
> jad com.mythymeleaf.demo.config.MyWebMvcConfig// 反编译只生成源码
> jad --source-only demo.MathGame// 反编译指定方法
> jad demo.MathGame main

n.4 JVM 查看

- LOADED-CLASS-COUNT : 加载的class数目
- COUNT: JVM 当前活跃的线程数
- DAEMON-COUNT: JVM 当前活跃的守护线程数
- PEAK-COUNT:JVM 启动开始曾经活着的最大线程数
- STARTED-COUNT:JVM 启动开始总共启动过的线程次数
- DEADLOCK-COUNT: JVM 当前死锁的线程数
- MAX-FILE-DESCRIPTOR-COUNTJVM 进程最大可以打开的文件描述符数
- OPEN-FILE-DESCRIPTOR-COUNTJVM 当前打开的文件描述符数

n.5 查看 JVM 已加载的类

SC 查看 JVM 中已经加载的类

// 模糊查找加载的类型 
sc demo.*// 显示类的详细信息
sc -d com.mythymeleaf.demo.controller.DemoController// 输出类的成员变量信息
sc -d -f com.mythymeleaf.demo.controller.DemoController

SM 查询类的方法信息

// 查询类中的方法
sm java.lang.String// 查看方法的详细信息
sm -d java.lang.String toString

getstatic 获取类的静态信息

getstatic ClassName method

ognl 查看变量的值

ognl 就需要深度说说了 ,ognl 是一种强大的表达式语言 , 该语言最重要的是支持对对象方法的调用,同时支持类静态的方法调用和值访问 , ognl 的调用主要分为以下几类 :

  • 直接调用静态函数 : 写法就是 @类@方法 ,同时可以把参数传进去
  • 查看静态字段 : 同样 @类@字段名
  • 集合操作 :
  • 赋值操作 : 以 #value1=? 格式 , 创建对象等

@ https://cloud.tencent.com/developer/article/1554322

// ognl 原生语法
@java.lang.String@format('foo %s', 'bar')// 调用静态函数 (调用后会直接在服务上执行)
ognl '@java.lang.System@out.println("hello")'
ognl '@java.lang.Math@max(10, 20)'// 获取静态字段
ognl '@demo.MathGame@random'// 普通对象调用
ognl '#obj.method( 参数 )'// 赋值操作 
ognl '#value="abv"'
ognl '#value1="abc", #value2="efg", {#value1, #value2}'// 对象创建
ognl 'new java.lang.String("hello world")'
ognl '(#user=new User(),  #user.name="一灰灰Blog", #user.age=18, #user)'// 集合操作
ognl '"name" in {"name", "hello"}' >> 判断是否包含

n.6 方法执行情况监控 - Watch

Watch 的 表达式常量 :

- clazz : 对象的类
- method : 构造函数或方法
- params : 方法的参数数组
- params[0..n] : 参数数组的元素
- returnObj : method的返回对象
- throwExp : 方法的抛出异常
- isReturn : 返回结束的方法
- isThrow : 方法以引发异常结束

Watch 常用的语句

// 查看方法的执行情况 (会打印6次方法的调用)
watch com.test.points.clean.impl.UserServices processData -n 6// 打印指定输入参数的方法
watch com.test.points.clean.impl.UserServices processData 'params[0]=="Arthas"'
watch com.test.points.clean.impl.UserServices processData 'params[0].size==2'
watch com.test.points.clean.impl.UserServices processData 'params[1].username="antBlack"'// 指定打印参数
watch com.test.points.clean.impl.UserServices processData {params,returnObj}
watch com.test.points.clean.impl.UserServices processData {clazz,returnObj}
watch com.test.points.clean.impl.UserServices processData {method,returnObj}// 指定对象的遍历深度 (参数可能只会打一个引用 , 则需要通过遍历深度进行更深度的打印)
watch com.test.points.clean.impl.UserServices processData {params,returnObj} -x 2// 查看返回异常的请求方法
watch com.test.points.clean.impl.UserServices processData throwExp 'params[0].size==2'

n.6 方法调用监控 - Monitor

Monitor 是一种维度的监控 ,主要监控调用次数 , 成功次数 ,失败次数等

在这里插入图片描述

// 统计方法的调用情况
monitor com.test.points.clean.impl.UserServices processData -c 5// 通过参数获取监控
monitor -c 5 com.test.points.clean.impl.UserServices processData "params[0] <= 2"

n.7 查看方法的调用路径 Trace

在这里插入图片描述

// 打印方法执行时间
trace com.test.points.clean.impl.UserServices processData // 跳过 JDK 方法// 只打印调用时间超过 10 秒的方法
trace com.test.points.clean.impl.UserServices processData '#cost > 10'// 打印多个类路径
trace -E com.test.ClassA|org.test.ClassB method1|method2|method3// 跳过 JDK 方法
trace --skipJDKMethod false com.test.points.clean.impl.UserServices processData -n 2

n.8 查看方法调用时空隧道 tt

// 查看调用情况 @ https://arthas.aliyun.com/doc/tt.html#%E8%AE%B0%E5%BD%95%E8%B0%83%E7%94%A8
tt -t com.gang.web.demo.controller.BeanController testUser
(PS : 这个调用可以实时记录)// 通过表达式进行筛选
tt -s 'method.name=="search"'// 有服务端重调 (通过索引ID)
tt -i 1004 -p

在这里插入图片描述

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

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

相关文章

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之RowSplit容器组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之RowSplit容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、RowSplit容器组件 将子组件横向布局&#xff0c;并在每个子组件之间插入一…

【力扣】208.实现Trie

实不相瞒&#xff0c;我怎么感觉洛谷里面的题目好难呢&#xff1f;虽然说万变不离其宗&#xff0c;但是我就觉得刷洛谷的题让我心情烦躁&#xff0c;刷不下去。于是今天我就刷力扣去了&#xff0c;明天继续挣扎吧&#xff01; 这道题目其实挺简单的&#xff0c;但是刚开始我没看…

如何使用宝塔面板部署MySQL数据库,并结合内网穿透实现固定公网地址远程连接

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.1 开放局域网端口3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几…

力扣543. 二叉树的直径

Problem: 543. 二叉树的直径 文章目录 题目描述思路复杂度Code 题目描述 思路 1.最大直径 左子树的最大深度 右子树的最大深度&#xff1b; 2.定义一个变量maxDiameter记录最大直径&#xff0c;并编写一个递归函数maxDepth&#xff0c;利用树的后序遍历每次递归求取leftMax&a…

我的第②个出海工具站 - 2024年50个出海工具站计划

为了大家更好的使用各种出海工具。我上线了一版 出海工具导航 站点&#xff0c;经常使用的可以收藏下&#xff0c;我文内使用的网站都集成在了这里&#xff0c;非常使用。 随着AIGC的到来&#xff0c;2024年到了海外工具回暖的一年。今年计划上线50款出海工具站计划&#xff0c…

Stable Diffusion ———LDM、SD 1.0, 1.5, 2.0、SDXL、SDXL-Turbo等版本之间关系现原理详解

前言 2021年5月&#xff0c;OpenAI发表了《扩散模型超越GANs》的文章&#xff0c;标志着扩散模型&#xff08;Diffusion Models&#xff0c;DM&#xff09;在图像生成领域开始超越传统的GAN模型&#xff0c;进一步推动了DM的应用。 然而&#xff0c;早期的DM直接作用于像素空…

7.1.3 Selenium的用法2

目录 1. 切换 Frame 2. 前进后退 3. 对 Cookies 操作 4. 选项卡管理(了解) 5. 异常处理 6. 反屏蔽 7. 无头模式 1. 切换 Frame 我们知道网页中有一种节点叫作 iframe&#xff0c;也就是子 Frame&#xff0c;相当于页面的子页面&#xff0c;它的结构和外部网页的结构完全…

个人如何解除电信黑名单:步骤与注意事项

最近很多小编的粉丝给我留言&#xff1a;不知道为什么自己咋就成了电信黑名单了呢&#xff1f;该怎么解除呢&#xff1f;相信只要是遇到这个问题的小伙伴都会很焦虑&#xff0c;但是不要急&#xff0c;不要慌&#xff0c;今天小编就给大家讲讲明白&#xff0c;让大家更好的去解…

vue设计原理-带你重走vue诞生路程

我们首先看下面这个小demo demo源码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" conten…

「项目实践」如何实现导购推荐“千人千面”

前言 在电商背景下&#xff0c;为用户提供精准的导购推荐不仅能极大提升购物体验&#xff0c;也成为推动业务增长的关键驱动力。随着人工智能和数据科学的快速发展&#xff0c;实现“千人千面”的个性化推荐已不再是无法触及的梦想。如何在众多商品中准确捕捉用户的偏好&#…

简洁版用户登录系统

前端页面&#xff1a; 用户登录首页&#xff1a; <!doctype html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximu…

matlab 实现模糊C均值聚类

1. 原理 模糊c均值算法步骤&#xff1a; 1. 设定聚类数目c和加权指数b&#xff1a; 2. 初始化各个聚类中心m 3. 重复下面的运算&#xff0c;直到各个样本的隶属度值稳定&#xff1a;用当前的聚类中心根据下式计算隶属度函数&#xff1a; 用当前的隶属度函数按下式更新计算各…