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#常见问题

相关推荐
hummhumm13 分钟前
Oracle 第13章:事务处理
开发语言·数据库·后端·python·sql·oracle·database
@尘音16 分钟前
QT——记事本项目
开发语言·qt
童先生17 分钟前
python 用于请求chartGpt DEMO request请求方式
开发语言·python
qing_04060319 分钟前
C++——string的模拟实现(上)
开发语言·c++·string
魔道不误砍柴功20 分钟前
Java 中 String str = new String(“hello“); 里面创建了几个对象?
java·开发语言·string·new
长潇若雪1 小时前
指针进阶(四)(C 语言)
c语言·开发语言·经验分享·1024程序员节
梦想科研社2 小时前
【无人机设计与控制】红嘴蓝鹊优化器RBMO求解无人机路径规划MATLAB
开发语言·matlab·无人机
混迹网络的权某2 小时前
每天一道C语言精选编程题之求数字的每⼀位之和
c语言·开发语言·考研·算法·改行学it·1024程序员节
一只特立独行的猪6113 小时前
Java面试题——微服务篇
java·开发语言·微服务
喵手5 小时前
Java 与 Oracle 数据泵实操:数据导入导出的全方位指南
java·开发语言·oracle