arthas使用 笔记

下载启动

plain 复制代码
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] 显示所有匹配的线程
plain 复制代码
//当前最忙的前 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 ]。
plain 复制代码
//每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 ]
plain 复制代码
//观察表达式,默认值是{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],
    ],
]
plain 复制代码
//按照耗时进行过滤
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 ]
plain 复制代码
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。

  • 用途:记录方法的每次调用细节,包括参数和返回值,形成时间隧道,供事后分析。
  • 场景:复现问题,尤其是那些难以立即捕捉到的问题场景。
plain 复制代码
 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源代码。
  • 场景:当没有源代码时,帮助理解方法内部逻辑。
plain 复制代码
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#常见问题

相关推荐
西猫雷婶3 小时前
python学opencv|读取图像(十九)使用cv2.rectangle()绘制矩形
开发语言·python·opencv
liuxin334455663 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
码农W3 小时前
QT--静态插件、动态插件
开发语言·qt
ke_wu4 小时前
结构型设计模式
开发语言·设计模式·组合模式·简单工厂模式·工厂方法模式·抽象工厂模式·装饰器模式
code04号4 小时前
python脚本:批量提取excel数据
开发语言·python·excel
小王爱吃月亮糖4 小时前
C++的23种设计模式
开发语言·c++·qt·算法·设计模式·ecmascript
hakesashou4 小时前
python如何打乱list
开发语言·python
_im.m.z4 小时前
【设计模式学习笔记】1. 设计模式概述
笔记·学习·设计模式
网络风云4 小时前
【魅力golang】之-反射
开发语言·后端·golang
Want5955 小时前
Java圣诞树
开发语言·python·信息可视化