下载启动
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