当前位置: 首页 > article >正文

arthas使用 笔记

下载启动

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

java -jar arthas-boot.jar

基本命令使用

JVM相关命令

Dashboard - 仪表盘
  • 用途:查看当前Java应用的实时性能面板,包括CPU、线程、内存使用情况等。
  • 场景:快速概览系统整体健康状态。

thread

查看当前线程信息,查看线程的堆栈

  • 用途:查询和分析线程堆栈信息。
  • 场景:排查死锁、线程阻塞、线程过多等问题。
参数名称参数说明
id线程 id
[n:]指定最忙的前 N 个线程并打印堆栈
[b]找出当前阻塞其他线程的线程
[i ]指定 cpu 使用率统计的采样间隔,单位为毫秒,默认值为 200
[–all]显示所有匹配的线程
//当前最忙的前 N 个线程并打印堆栈
thread -n 3

thread -i 1000 : 统计最近 1000ms 内的线程 CPU 时间。

//排查线程死锁
thread -b

thread -i 200 //命令的作用是每隔200毫秒对线程信息进行一次采样

监控类命令

monitor 方法执行监控

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

monitor 命令是一个非实时返回命令.

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

服务端是以任务的形式在后台跑任务,植入的代码随着任务的中止而不会被执行,所以任务关闭后,不会对原有性能产生太大影响,而且原则上,任何 Arthas 命令不会引起原有业务逻辑的改变。

参数名称参数说明
class-pattern类名表达式匹配
method-pattern方法名表达式匹配
condition-express条件表达式
[E]开启正则表达式匹配,默认为通配符匹配
[c:][c:]统计周期,默认值为 120 秒
[b]方法调用之前计算 condition-express
[m ][m ]指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch ]。
//每5秒监控ArticleApiController类里面的articleList方法
monitor -c 5 com.blog.blogservice.api.controller.api.ArticleApiController articleList

//访问超过3次才被记录(包括3)
monitor -c 5 -m 3

//第一个参数params[0](第一个参数)的值小于等于2时 记录
monitor -c 5 demo.MathGame primeFactors "params[0] <= 2"

watch 函数执行数据观测

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

参数名称参数说明
class-pattern类名表达式匹配
method-pattern函数名表达式匹配
express观察表达式,默认值:{params, target, returnObj}
condition-express条件表达式
[b]函数调用之前观察
[e]函数异常之后观察
[s]函数返回之后观察
[f]函数结束之后(正常返回和异常返回)观察
[E]开启正则表达式匹配,默认为通配符匹配
[x:]指定输出结果的属性遍历深度,默认为 1,最大值是 4
[m ][m ]指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch ]
//观察表达式,默认值是{params, target, returnObj}
//
watch com.blog.blogservice.api.controller.api.ArticleApiController articleList -x 2



Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 110 ms, listenerId: 5
method=com.blog.blogservice.api.controller.api.ArticleApiController.articleList location=AtExitts=2024-05-02 10:05:53; [cost=11.763535ms] result=@ArrayList[
    @Object[][
        //入参
        @Article[com.blog.blogservice.domain.entity.Article@3e66df7c],
    ],
    //入口
    @ArticleApiController[
        articleService=@$Proxy94[com.blog.blogservice.app.service.impl.ArticleServiceImpl@5d59c012],
    ],
    //返回结果
    @ResponseEntity[
        status=@HttpStatus[200 OK],
        EMPTY=@HttpEntity[<[]>],
        headers=@ReadOnlyHttpHeaders[isEmpty=true;size=0],
        body=@ArrayList[isEmpty=false;size=7],
    ],
]
//按照耗时进行过滤
watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2
trace 打印某方法调用路径,并输出每个节点的耗时

方法内部调用路径,并输出方法路径上的每个节点上耗时,trace 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,但其每次只能跟踪一级方法的调用链路。

  • 用途:追踪方法的调用路径并统计每个节点耗时。
  • 场景:定位性能瓶颈,特别是方法调用耗时过长的问题。
参数名称参数说明
class-pattern类名表达式匹配
method-pattern方法名表达式匹配
condition-express条件表达式
[E]开启正则表达式匹配,默认为通配符匹配
[n:][n:]命令执行次数
#cost#cost方法执行耗时
[m <arg[m ]>]指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch ]
trace com.blog.blogservice.api.controller.api.ArticleApiController(类名) articleList(方法名)


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

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

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

  • 用途:打印指定线程或所有线程的堆栈信息。
  • 场景:详细了解线程当前的执行状态,辅助分析死锁或线程挂起原因。
参数名称参数说明
class-pattern类名表达式匹配
method-pattern方法名表达式匹配
condition-express条件表达式
[E]开启正则表达式匹配,默认为通配符匹配
[n:]执行次数限制
[m ]指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch ]

tt

方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测、

tt 相关功能在使用完之后,需要手动释放内存,否则长时间可能导致OOM。退出 arthas 不会自动清除 tt 的缓存 map。

  • 用途:记录方法的每次调用细节,包括参数和返回值,形成时间隧道,供事后分析。
  • 场景:复现问题,尤其是那些难以立即捕捉到的问题场景。

 tt -t com.blog.blogservice.api.controller.api.ArticleApiController articleList

//有记录的话 查询列表
 tt -l
//筛选出 primeFactors 方法的调用信息
 tt -s 'method.name=="primeFactors"'

//通过索引删除指定的 tt 记录
 tt -d 1001
//清除所有的 tt 记录
 tt --delete-all

profiler - 生成火焰图

https://arthas.aliyun.com/doc/profiler.html

classloader相关的命令

jad - 反编译已加载类源码

jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑.

  • 用途:反编译指定类的字节码为Java源代码。
  • 场景:当没有源代码时,帮助理解方法内部逻辑。

jad com.blog.blogservice.api.controller.api.ArticleApiController\

//反编译时只显示源代码
jad --source-only demo.MathGame

//反编译时只显示方法
jad com.blog.blogservice.api.controller.api.ArticleApiController articleList

//不显示行号
jad demo.MathGame main --lineNumber false

mc - 将java文件在内存里编译为class文件
  • 用途:清空方法缓存,让JVM重新编译方法。
  • 场景:修改代码后,快速应用变更,无需重启。

https://arthas.aliyun.com/doc/mc.html

redefine - 加载外部的.class文件,redefine到JVM里

https://arthas.aliyun.com/doc/redefine.html#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98


http://www.kler.cn/a/369327.html

相关文章:

  • Spring Boot 通过注解校验参数
  • C++《vector的模拟实现》
  • spark on kubernetes运行测试
  • HBuilder X 中Vue.js基础使用2(三)
  • ReactNative JSI(4)
  • Maven 介绍与核心概念解析
  • 2025选题|基于Hadoop的物品租赁系统的设计与实现
  • windows 训练yolov8官方数据集
  • SpringBoot poi-tl通过模板占位符生成word文件
  • 奥哲与中建三局集团有限公司战略签约
  • 美畅物联丨视频上云网关如何配置上级联网云平台
  • nacos安装与配置
  • 存储引用服务(OSS)Minio 环境搭建
  • 最新版的 Git+VS Code同步版本管理实践
  • 运维面试汇总
  • [JAVAEE] 面试题(一) - 锁策略, synchronized的详细介绍
  • 标题点击可跳转网页
  • 【32】C++流
  • ETLCloud+Doris组合:数据集成,更简单更高效
  • Linux系统基础-进程间通信(5)_模拟实现命名管道和共享内存
  • 【ubuntu18.04】ubuntu18.04 编译LightGBM操作说明
  • 大众点评 web mtgsig 1.2分析
  • AI跟踪报道第62期-本周AI新闻: 微软推出Copilot的AI Agent和Computer Control
  • 【学术会议投稿】Imagen:重塑图像生成领域的革命性突破
  • 深入理解Rust中的指针:裸指针 智能指针
  • Docker:容器