赞
踩
1.下载并运行arthas
下载:curl -O https://arthas.aliyun.com/arthas-boot.jar
运行:java -jar arthas-boot.jar
发现容器中集成了skywalking之后,不能运行成功。可以使用另一种方式运行。添加进程id
java -jar arthas-boot.jar pid
2.核心变量使用
核心变量是用来配合各个arthas命令使用的,并输出参数的。
params:本次调用参数列表,这是一个数组,如果方法是无参方法则为空数组
target:本次调用类的实例
returnObj: 本次调用返回的对象。当且仅当 isReturn==true
成立时候有效,表明方法调用是以正常返回的方式结束。如果当前方法无返回值 void
,则值为 null
核心变量使用都要遵循ognl表达式规则,官网如下:
https://commons.apache.org/proper/commons-ognl/language-guide.html
3.dashboard命令
查看该进程下的线程,以及所有堆栈的配置信息,还有运行的环境信息。
参数说明:
ID: Java 级别的线程 ID,注意这个 ID 不能跟 jstack 中的 nativeID 一一对应。
NAME: 线程名
GROUP: 线程组名
PRIORITY: 线程优先级, 1~10 之间的数字,越大表示优先级越高
STATE: 线程的状态
CPU%: 线程的 cpu 使用率。比如采样间隔 1000ms,某个线程的增量 cpu 时间为 100ms,则 cpu 使用率=100/1000=10%
DELTA_TIME: 上次采样之后线程运行增量 CPU 时间,数据格式为秒
TIME: 线程运行总 CPU 时间,数据格式为分:秒
INTERRUPTED: 线程当前的中断位状态
DAEMON: 是否是 daemon 线程
4.thread 命令
查看当前线程信息,查看线程的堆栈
thread id, 显示指定线程的运行堆栈
thread -b, 找出当前阻塞其他线程的线程,目前只支持找出 synchronized 关键字阻塞住的线程。
thread -n 3 -i 1000 列出 1000ms 内最忙的 3 个线程栈
thread --state WAITING 查看指定状态的线程
5. memory
查看 JVM 内存信息。
6.jad 命令
反编译指定已加载类的源码,在线上可查看代码是否已经部署上去
jad com.zhqc.cloud.frame.core.test.TestController
7.mc命令
Memory Compiler/内存编译器,编译.java
文件生成.class
。可以结合retransform命令实现热更新代码。
注意,mc 命令有可能失败。如果编译失败可以在本地编译好.class
文件,再上传到服务器。具体参考retransform命令说明。
8.retransform命令
加载外部的.class
文件,retransform jvm 已加载的类。
retransform 指定的 .class 文件
retransform /tmp/MathGame.class
查看 retransform entry
retransform -l
删除所有 retransform entry
retransform --deleteAll
结合 jad/mc 命令使用
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
mc /tmp/UserController.java -d /tmp
retransform /tmp/com/example/demo/arthas/user/UserController.class
7.monitor命令
方法执行监控
monitor -c 5 com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter '#cost>1000'
-c 5 表示每5秒一次
#cost>1000 表示花费时间超过1000毫秒的方法
monitor -c 5 com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter 'returnObj.code =00000'
returnObj.code =00000 代表结果中返回code为00000的方法。
返回参数:
timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------
2020-09-02 09:41:57 demo.MathGame primeFactors 1 0 1 0.10 100.00%
avg-rt(ms) 为方法平均响应时间
8.stack命令
输出当前方法被调用的调用路径。可以用来找到这个方法,是从哪里被调用的,可以用搭配trace方法一起使用,定位到哪个方法用的耗时比较长。
stack com.zhqc.cloud.frame.core.test.TestController testDubboNetwork -n 3
-n 3 代表只输出3次
stack com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter '#cost>1000'
#cost>1000 表示花费时间超过1000毫秒的方法
9.trace命令
方法内部调用路径,并输出方法路径上的每个节点上耗时。trace
命令能主动搜索 class-pattern
/method-pattern
对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。虽能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,但其每次只能跟踪一级方法的调用链路。所以需要定位下一级方法的性能,就得多次定位。
trace com.zhqc.cloud.gateway.filter.TestAuthorizationFilter verifyTokenAndSetHeader -n 1
-n 1 代表只输出1次
trace com.zhqc.cloud.frame.core.test.TestController testDubboNetwork '#cost>1000'
#cost>1000 表示花费时间超过1000毫秒的方法
10.watch命令
函数执行数据观测。让你能方便的观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
watch com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter invoke -x 2
-x 2 代表只输出参数的第二层级
stack com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter "{params,returnObj}" -x 2 -b
params 入参参数
returnObj 返回结果参数
target 类实例
-b 函数调用之前
-e 函数异常之后
-s 函数返回之后
-f 函数结束之后(正常返回和异常返回)
-E 开启正则表达式
#cost 耗时
-v 打印具体的值
--exclude-class-pattern 排除具体的类
11. tt命令
方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。tt 相关功能在使用完之后,需要手动释放内存,否则长时间可能导致OOM。退出 arthas 不会自动清除 tt 的缓存 map。清除所有的 tt 记录,tt --delete-all。
tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter
记录下当前方法的每次调用环境现场
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d TestAuthorizationFilter filter
1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d TestAuthorizationFilter filter
参数说明:
INDEX 时间片段记录编号,每一个编号代表着一次调用,后续 tt 还有很多命令都是基于此编号指定记录操作,非常重要。
TIMESTAMP 方法执行的本机时间,记录了这个时间片段所发生的本机时间
COST(ms) 方法执行的耗时
IS-RET 方法是否以正常返回的形式结束
IS-EXP 方法是否以抛异常的形式结束
OBJECT 执行对象的hashCode(),注意,曾经有人误认为是对象在 JVM 中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体
CLASS 执行的类名
METHOD 执行的方法名
解决方法重载
参数个数
tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter params.length==1
参数类型
tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter 'params[1] instanceof Integer'
解决指定参数
tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter params[0].code=="abs"
对于具体的调用信息查看
tt -i 1000
重复调用
tt -i 1000 -p --replay-times 10 --replay-interval 1000
-p 重复调用
--replay-times 重复调用次数
--replay-interval 重复调用的间隔时间ms
获取到spring context
拦截请求:RequestMappingHandlerAdapter#invokeHandlerMethod
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
Arthas会拦截到这个调用,index是1000
tt -i 1000 -w 'target.getApplicationContext()'
@AnnotationConfigEmbeddedWebApplicationContext[ reader=@AnnotatedBeanDefinitionReader[org.springframework.context.annotation.AnnotatedBeanDefinitionReader@35dc90ec], scanner=@ClassPathBeanDefinitionScanner[org.springframework.context.annotation.ClassPathBeanDefinitionScanner@72078a14], annotatedClasses=null, basePackages=null, ] Affect(row-cnt:1) cost in 7 ms.
从spring context里获取任意bean,并调用函数
tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()'
最后记得使用完, tt -d 1000 删除该命令占用的内存。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。