Java 诊断利器 Arthas monitor/watch/trace命令

news2024/11/20 14:32:41

一、监控相关命令介绍

二、监控相关命令

2.1、运行Demo

2.2、monitor 命令

2.2.1、方法监控

2.3、watch 命令 (重要)

2.3.1、观察函数调用返回时的参数、this 对象和返回值

2.3.2、查看函数调用的入参和返回值

2.3.3、深度遍历 x 说明

2.3.4、查看方法调用前和函数返回后的值

2.4、trace 命令(重要)

2.4.1、查看方法耗时情况

2.4.2、据调用耗时过滤(重要)

2.4.3、包含 JDK 函数

2.4.4、trace 多个类或者多个函数

2.5、stack 命令(重要)

2.5.1、查看方法被调用的调用情况

2.5.2、根据条件表达式来过滤


一、监控相关命令介绍

        stack、trace、watch 线上使用比较多,本篇会详细介绍这几个命令。

命令说明
monitor方法执行监控
stack输出当前方法被调用的调用路径
trace方法内部调用路径,并输出方法路径上的每个节点上耗时
watch方法执行数据观测

这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。

watch/stack/trace这个三个命令都支持#cost

二、监控相关命令

2.1、运行Demo

        在官方提供的 arthas( arthas-bin.zip)程序中,提供一个 math-game.jar 的 demo ,本章就通过该demo进行演示。

        运行 math-game.jar

java -jar math-game.jar 

        启动 arthas 连接到该 java 程序

        math-game 的源代码如下: 

https://github.com/alibaba/arthas/blob/master/math-game/src/main/java/demo/MathGame.java

public List<Integer> primeFactors(int number) {
    if (number < 2) {
        illegalArgumentCount++;
        throw new IllegalArgumentException("number is: " + number + ", need >= 2");
    }

    List<Integer> result = new ArrayList<Integer>();
    int i = 2;
    while (i <= number) {
        if (number % i == 0) {
            result.add(i);
            number = number / i;
            i = 2;
        } else {
            i++;
        }
    }

    return result;
}

2.2、monitor 命令

        对匹配 class-pattern/method-pattern/condition-express的类、方法的调用进行监控。

        monitor 命令是一个非实时返回命令,实时返回命令是输入之后立即返回,而非实时返回的命令,则是不断的等待目标 Java 进程返回信息,直到用户输入 Ctrl+C 为止。

        服务端是以任务的形式在后台跑任务,植入的代码随着任务的中止而不会被执行,所以任务关闭后,不会对原有性能产生太大影响。

参数:

        方法拥有一个命名参数 [c:],意思是统计周期(cycle of output),拥有一个整型的参数值

参数名称参数说明

class-pattern

类名表达式匹配

method-pattern

方法名表达式匹配

condition-express

条件表达式

[E]

开启正则表达式匹配,默认为通配符匹配

[c:]

统计周期,默认值为120秒

[b]

在方法调用之前计算condition-express

使用说明:

        2.2.1、方法监控

        查看 MathGame 类中 primeFactors方法的运行情况,默认值为120秒输出一次结果,可以通过 -c 指定统计周期,按 Q 或者 Ctrl+C 来终止。

monitor demo.MathGame primeFactors

         每隔 5s 统计一次方法运行情况。

monitor demo.MathGame primeFactors -c 5 

数据说明:

监控项说明

timestamp

时间戳

class

Java类

method

方法(构造方法、普通方法)

total

调用次数

success

成功次数

fail

失败次数

rt

平均RT

fail-rate

失败率

2.3、watch 命令 (重要)

        函数执行数据观测,让你能方便的观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。

参数:

        watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象 —— 函数调用之前,函数异常之后,函数返回之后,函数结束之后。

参数名称参数说明

class-pattern

类名表达式匹配

method-pattern

函数名表达式匹配

express

观察表达式,默认值:{params, target, returnObj}

condition-express

条件表达式

[b]

函数调用之前观察

[e]

函数异常之后观察

[s]

函数返回之后观察

[f]

函数结束之后(正常返回和异常返回)观察

[E]

开启正则表达式匹配,默认为通配符匹配

[x:]

指定输出结果的属性遍历深度,默认为 1

        观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写"{params,returnObj}",只要是一个合法的 ognl 表达式,都能被正常支持。

        OGNL 表达式官网:

        https://commons.apache.org/proper/commons-ognl/language-guide.html

使用说明:

        2.3.1、观察函数调用返回时的参数、this 对象和返回值

        查看 demo.MathGame 类中 primeFactors 方法出参和返回值

watch demo.MathGame primeFactors

  • 观察表达式,默认值是{params, target, returnObj},params 是入参,target 是 this 对象,returnObj 是返回值
  • 函数被执行了两次,第一次结果是location=AtExit,说明函数正常返回,因此可以看到returnObj结果是一个 ArrayList
  • 第二次结果里是location=AtExceptionExit,说明函数抛出异常了,因此 returnObj 是 null
  • ts 是时间戳,表示当前方法执行时间,cost 是指当前方法耗时
  • 默认深度遍历x=1,只显示最外层对象属性,入参 Object 表示入参是个对象,返回值为 ArrayList 表示返回是个对象数组

        2.3.2、查看函数调用的入参和返回值

        查看 demo.MathGame 类中 primeFactors 方法出参和返回值,结果属性遍历深度为2。

watch demo.MathGame primeFactors "{params,returnObj}" -x 2

  • 函数被执行了两次,第一次结果是location=AtExit,说明函数正常返回,因此可以看到returnObj结果是一个 ArrayList
  • 第二次结果里是location=AtExceptionExit,说明函数抛出异常了,因此returnObj是 null
  • 深度遍历x=2,不但显示对象属性,而且显示对象的值,入参 Object 表示入参是个Integer类型的对象,对象值为1,返回值为 ArrayList 数组,值为 2,2,5,347。

        2.3.3、深度遍历 x 说明

        在查看方法执行信息时,通过深度遍历参数 x 来查看参数和返回值显示的信息,x 值不同,显示的结果也不一样。

  • -x:表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是 1。
  • -x:最大值是 4,防止展开结果占用太多内存。用户可以在ognl表达式里指定更具体的 field。

        我们分别执行三条命令,查看 深度遍历 x = 1,x = 2,x = 3 的不同结果。其中 -n 表示执行几次结束,这里我们设置为1次。

watch demo.MathGame primeFactors -x 1 -n 1

watch demo.MathGame primeFactors -x 2 -n 1

watch demo.MathGame primeFactors -x 3 -n 1

  • 如果对象里面的对象属性越多,层级越深

        2.3.4、查看方法调用前和函数返回后的值

        查看 demo.MathGame 类中 primeFactors() 方法调用前和方法执行后返回的值。

  • 参数里 -n 2,表示只执行两次
  • 这里输出结果中,第一次输出的是函数调用前的观察表达式的结果,第二次输出的是函数返回后的表达式的结果
  • 结果的输出顺序和事件发生的先后顺序一致,和命令中 -s -b 的顺序无关
watch demo.MathGame primeFactors -b -s -n 2 -x 2

        2.3.5、观察当前对象中的属性

        查看 demo.MathGame 类中的属性值,遍历深度为2。 

watch demo.MathGame primeFactors "target" -x 2

        观察当前对象中的属性

        如果想查看函数运行前后,当前对象中的属性,可以使用 target 关键字,target 代表this 对象。查看 demo.MathGame 类中 primeFactors() 方法运行前的对象中属性值,遍历深度为2。 

watch demo.MathGame primeFactors "target" -b -x 2

        使用 target.field_name 可以访问当前对象的某个属性值,查看 demo.MathGame 类中 primeFactors() 方法运行时 illegalArgumentCount 属性的值,遍历深度为2

watch demo.MathGame primeFactors "target.illegalArgumentCount" -x 2

        2.3.6、条件表达式

        打印入参小于0的执行执行情况,只有满足条件的调用,才会有响应。使用 -v 参数打印更多信息。params[0] 时入参第一个参数,params[0] < 0 表示只显示第一个入参值小于0的信息。

     当命令执行之后,没有输出结果。有两种可能:

  1. 匹配到的函数没有被执行
  2. 条件表达式结果是 false

     但用户区分不出是哪种情况,使用 -v选项,则会打印Condition express的具体值和执行结果,方便确认。

watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0" -v

         按照方法执行耗时进行过滤

watch demo.MathGame primeFactors '{params, returnObj}' '#cost > 1' -x 2

#cost>1(单位是ms)表示只有当耗时大于 1ms 时才会输出,过滤掉执行时间小于 1ms 的调用。

        查看方法执行异常时的信息

watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2

2.4、trace 命令(重要)

        方法内部调用路径,并输出方法路径上的每个节点上耗时

        trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

        trace 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,但其每次只能跟踪一级方法的调用链路。

参数:

参数名称参数说明

class-pattern

类名表达式匹配

method-pattern

方法名表达式匹配

condition-express

条件表达式

[E]

开启正则表达式匹配,默认为通配符匹配

[n:]

命令执行次数

#cost

方法执行耗时

使用说明:

        2.4.1、查看方法耗时情况

        查看 demo.MathGame 类中 run() 方法执行耗时情况

        使用用 -n 参数指定捕捉结果的次数。

        2.4.2、据调用耗时过滤(重要)

        过滤 demo.MathGame 类中 run() 方法执行耗时情况,'#cost > 1' 表示只显示方法执行耗时大于 1ms 的执行情况,根据耗时进行过滤,有助于在排查问题的时候,只关注异常情况。

trace demo.MathGame run '#cost > 1'

        2.4.3、包含 JDK 函数

        trace 包含 jdk 里的函数调用情况

trace --skipJDKMethod false demo.MathGame run

        默认情况下,trace 不会包含 jdk 里的函数调用,如果希望 trace jdk 里的函数,需要显式设置--skipJDKMethod false。 

        2.4.4、trace 多个类或者多个函数

        trace 命令只会 trace 匹配到的函数里的子调用,并不会向下 trace 多层。因为 trace 是代价比较贵的,多层 trace 可能会导致最终要 trace 的类和函数非常多。

        可以用正则表匹配路径上的多个类和函数,一定程度上达到多层 trace 的效果。

        trace -E com.test.ClassA|org.test.ClassB method1|method2|method3

 trace -E demo.MathGame run|primeFactors

        查看  demo.MathGame 类中,run() 方法调用链上 run() 和 primeFactors() 方法执行耗时。

2.5、stack 命令(重要)

        输出当前方法被调用的调用路径

        很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。

参数:

参数名称参数说明

class-pattern

类名表达式匹配

method-pattern

方法名表达式匹配

condition-express

条件表达式

[E]

开启正则表达式匹配,默认为通配符匹配

[n:]

执行次数限制

使用说明

        2.5.1、查看方法被调用的调用情况

        查看 demo.MathGame 类中 primeFactors() 方法调用情况

stack demo.MathGame primeFactors

         输出结果中,demo.MathGame.primeFactors 被 demo.MathGame.run() 方法调用,demo.MathGame.run() 方法被 demo.MathGame.main() 方法调用。

        2.5.2、根据条件表达式来过滤

        查看 demo.MathGame 类中 primeFactors() 方法第一个入参小于0的调用情况

stack demo.MathGame primeFactors 'params[0] < 0' -n 2

        根据执行时间来过滤

        查看 demo.MathGame 类中 primeFactors() 方法执行耗时超过 1ms 的调用情况

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

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

相关文章

检验仪器控制怎么停止的

之前介绍仪器控制启动是按维护的调用M和仪器ID组串直接j启动进程&#xff0c;进程在调用Start启动TCP。 组装执行M串用j启动进程 启动TCP通道&#xff0c;成功之后就到f的死循环了 死循环这里容易有个误解&#xff0c;以为Stop是停止仪器接口的。其实这个Stop是判断要不要…

一灯大师,基于imx6ull点亮LED灯

一.imx6ull GPIO原理1. STM32 GPIO回顾我们一般拿到一款全新的芯片&#xff0c;第一个要做的事情的就是驱动其 GPIO&#xff0c;控制其 GPIO 输出高低电平&#xff0c;我们学习 I.MX6U 也一样的&#xff0c;先来学习一下 I.MX6U 的 GPIO。在学习 I.MX6U的 GPIO 之前&#xff0c…

Spark WordCount 案例

文章目录Spark WordCount 案例1、程序连接 Spark2、WordCount 案例示例3、复杂版 WordCount4、Spark 框架WordcountSpark WordCount 案例 1、程序连接 Spark 首先这个Scala spark程序和spark的链接&#xff0c;跟sql编程类似。首先new 一个新的val context SparkContext()对…

谷粒商城-高级篇-Day10-ElasticSearch

初步检索 1、_cat GET /_cat/nodes:查看所有节点 GET/_cat/health:查看es健康状况 GET/_cat/master:查看主节点 GET/_cat/indices:查看所有索引–相当于查询所有数据库 2、索引一个文档 put&#xff1a;http://192.168.205.128:9200/customer/external/1 {"name&qu…

Qt之加载百度离线地图(WebKit和WebEngine)

最近翻看进年前写了一篇关于百度离线地图的博客:Qt加载百度离线地图,发现存在很多问题,比如不能加载折线等图形覆盖物;只支持QtWebKit,不支持QtWebEngine。 之前做项目需要在百度离线地图上绘制Mesh拓扑图,必须添加折线覆盖物,使用的是百度离线地图API V2.1,满足需求。…

Java注解详解

什么是注解 ​ 用一个词就可以描述注解&#xff0c;那就是元数据&#xff0c;即一种描述数据的数据。所以&#xff0c;可以说注解就是源代码的元数据 元注解 JDK1.5之后内部提供的注解&#xff1a; Deprecated 意思是“废弃的&#xff0c;过时的”Override 意思是“重写、覆…

算法训练营 day18 二叉树 找树左下角的值 路径总和 从中序与后序遍历构建二叉树

算法训练营 day18 二叉树 找树左下角的值 路径总和 从中序与后序遍历构建二叉树 找树的左下角 513. 找树左下角的值 - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节…

Java --- JUC之原子类

目录​​​​​​​ 一、基本类型原子类 二、数组类型原子类 三、引用类型原子类 四、对象的属性修改类型原子类 五、原子操作增强类 5.1、高性能热点商品应用 5.2、LongAdder架构图 5.3、源码分析 一、基本类型原子类 public class AtomicTest1 {public static final…

canvas:基础知识【直线和矩形】

canvas&#xff0c;就是画布&#xff0c;是HTML5和核心技术之一&#xff0c;结合JavaScript&#xff0c;可以绘制各种各样的图形&#xff0c;比如矩形、曲线、圆形等等。另外&#xff0c;canvas可以绘制图表、动画效果、游戏开发。 基本图形汇中有直线和曲线。常见的直线图形是…

arduino rc522模块使用

rfid IC卡 先了解IC卡一些前置知识。 首先我们会有一张ic卡&#xff08;M1类型IC卡&#xff0c;一般买到的都是1K存储空间&#xff09;&#xff0c;在rc522代码中会出现这个&#xff0c;就是对IC卡进行检查PICC_TYPE_MIFARE_4K和PICC_TYPE_MIFARE_1K就是一种卡片类型不同大小…

零基础学MySQL(二)-- 表的创建,修改,删除

文章目录&#x1f388;一、创建表1️⃣基本语法2️⃣入门案例&#x1f386;二、MySQL常用数据类型1️⃣数值型&#xff08;整型&#xff09;默认有符号2️⃣数值型&#xff08;bit&#xff09;3️⃣数值型&#xff08;浮点型&#xff09;默认有符号4️⃣字符串的基本使用5️⃣字…

1584_AURIX_TC275_SMU的调试以及部分寄存器

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 前面学习的过程中&#xff0c;突然间减速了不少。但是为了保证学习的推进&#xff0c;还是得有每天的稳定输出。我的策略是多看&#xff0c;多处理&#xff0c;之后每天整理10页标注的文档…

设计模式相关内容介绍

1.学习设计模式好处 提高编程能力、思维能力、设计能力程序设计更加标准化、代码编制更加工程化&#xff0c;软件开发效率大大提高&#xff0c;缩短项目周期设计的代码可重用性高、可读性强、可靠性高、 灵活性好、可维护性强 2.设计模式分类 创建型模式 提供创建对象的机制…

一文读懂工业级交换机的规范使用

工业交换机具备电信级特性特点&#xff0c;可承受严苛的工作环境&#xff0c;产品种类丰富多彩&#xff0c;交换机配置灵便&#xff0c;可以满足各类工业应用的应用标准。那么&#xff0c;大家使用工业级交换机的过程当中应该如何规范使用呢&#xff1f; 工业级交换机其实质运…

蓝队攻击的四个阶段(四)

目录 一&#xff0c; 外网纵向突破 1.1 何为外网纵向突破 1.2外网纵向突破的主要工作 二&#xff0c; 外网纵向突破的途径 1. Web 网站 2.外部邮件系统 3.边界网络设备 4.外部应用平台 三&#xff0c;内网横向拓展 1. 1何为内网横向拓展 1.2 内网横向拓展的主要工作 …

电商价格监测,关注这些,才算实际到手价

品牌控价的第一项工作&#xff0c;是先找出低价乱价链接&#xff0c;这就需要进行电商价格监测。但是我们搜索品牌链接的时候&#xff0c;会发现网页上的价格是多种多样&#xff1a;有原价&#xff08;但是划掉了&#xff09;、促销价、折扣价、惊喜价&#xff0c;优惠活动也是…

localStorage

localStorage localStorage了解 有些数据确实需要存储在本地&#xff0c;但是它却不需要发送到服务器&#xff0c;所以并不适合放在cookie中 localStorage 也是一种浏览器存储数据的方式&#xff08;本地存储&#xff09;&#xff0c;它只是存储在本地&#xff0c;不会发送…

【Linux】进程间通信(1)

信号 什么是信号&#xff1f;信号是给程序提供一种可以处理异步事件的方法&#xff0c;它利用软件中断来实现。不能自定义信号&#xff0c;所有信号都是系统预定义的。 信号由谁产生&#xff1f; 由shell终端根据当前发生的错误&#xff08;段错误、非法指令等&#xff09;Ctr…

商品详情的APP原数据接口测试

一、原数据接口的来源&#xff1a; 原数据接口来源于手机端&#xff0c;随着智能化的发展与普及&#xff0c;越来越多的人都是使用智能手机&#xff0c;这样极大的方便了人民的生活&#xff0c;各大电商平台看准了这个商家&#xff0c;把目光都瞄准这个商机&#xff0c;伴随而…

BP靶场中SQL注入练习

BP靶场中SQL注入练习1.Bp靶场介绍1.1.访问靶场1.2.注意事项2.SQL注入靶场2.1.注意事项2.2.检索隐藏数据2.2.1.开启靶场2.2.2.点击礼物2.2.3.测试类型2.2.4.爆出全部物品(包括隐藏)2.3.登录逻辑2.3.1.开启靶场2.3.2.登录账户2.3.3.注释验证2.3.4.成功登陆2.4.判断列2.4.1.开启靶…