arthas排查问题

1,022 阅读6分钟

今天dev、pre环境的代码run都是好的,上了uat环境就不行了。仔细的看了一遍并没有什么多大的问题,最后只能使用arthas排查方法入参、返回值。

介绍一下自己常用的命令。

1.watch 方法执行数据观测 (watch 全包名 方法名 参数)

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

watch com.test.Test show "{params,returnObj}" -x 2 -b -e -s -f

观察的方法为Test类下的show()方法,
"{params,returnObj}"是观察表达式,是一个ognl表达式,
-x 2是指定输出结果的属性遍历深度,默认值为1,为1时看不到参数的具体值,只能看到类型;
-b:在方法调用之前观察,用此命令可查看方法的入参
-e:在方法异常之后观察。用此命令可查看方法抛出的异常
-s:在方法返回之后观察,可查看方法的返回值
-f:在方法结束之后(正常返回和异常返回)观察,可查看方法的返回值和异常信息,默认打开-f

2.trace 方法调用链

trace 命令能主动搜索方法调用路径,,并输出方法路径上的每个节点上耗时,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

trace com.test.Test show

-   `thread_name` :线程名称
-   `id`:内部线程id
-   `is_daemon` : 是否为守护线程
-   `priority`:线程优先级
-   `TCCL`:类加载器

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

和trace命令类似,不同的是stack只输出调用路径,且stack可以通过表达式来过滤,就像下面这个命令,只过滤show方法第一个参数值大于320的方法,-n 2表示过滤2次

stack com.test.Test show 'params[0]>320' -n 2

4.tt 记录下指定方法每次调用的入参和返回信息

watch 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。

这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。

tt -t -n 3 com.test.Test show

-t 表示这个参数的表明希望记录下类 Test 的 show() 方法的每次执行情况。
-n 3 :当你执行一个调用量不高的方法时可能你还能有足够的时间用 CTRL+C 中断 tt 命令记录的过程,但如果遇到调用量非常大的方法,瞬间就能将你的 JVM 内存撑爆。此时你可以通过 -n 参数指定你需要记录的次数,当达到记录次数时 Arthas 会主动中断tt命令的记录过程,避免人工操作无法停止的情况。

这里只展示watch命令,执行了之后就会在监听,然后要前端调用下,或是要下curl自己调用下。

image.png

基础命令	说明
cls	清空当前屏幕区域。
session	查看当前会话的信息,显示当前绑定的pid以及会话id。
reset	重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端stop时会重置所有增强过的类
version	输出当前目标 Java 进程所加载的 Arthas 版本号
history	打印历史命令,打印出你在使用arthas过程中输入了哪些命令。
keymap	输出arthas的快捷键映射表:

---

进阶命令	说明
dashboard	查看当前系统的实时数据面板,例如:服务器thread信息、内存memory、GC回收等情况
thread	查看线程的堆栈信息
jvm	打印出jvm的信息,包括参数和变量,以及用的jvm名字、系统等等
sysprop	查看当前JVM的系统属性(System Property)
sysenv	查看当前JVM的环境属性(System Environment Variables)
vmoption	查看,更新VM诊断相关的参数
perfcounter	查看当前JVM的 Perf Counter信息
logger	查看logger信息,更新logger level(级别)
mbean	这个命令可以便捷的查看或监控 Mbean 的属性信息。
getstatic	通过getstatic命令可以方便的查看类的静态属性。使用方法为getstatic class_name field_name,推荐直接使用ognl命令,更加灵活。
ognl	执行ognl表达式,此命令可动态执行代码
sc	查看JVM已加载的类信息,可以查看类在哪个jar包里面
sm	查看已加载类的方法信息
dump	dump 已加载类的 bytecode 到特定目录
heapdump	dump java heap, 类似jmap命令的heap dump功能。
vmtool	vmtool 利用JVMTI接口,实现查询内存对象,强制GC等功能。
jad	反编译指定已加载类的源码
classloader	查看classloader的继承树,urls,类加载信息
mc	Memory Compiler/内存编译器,编译.java文件生成.class。
retransform	加载外部的.class文件,动态重新加载 jvm已加载的类。
redefine	加载外部的.class文件,redefine jvm已加载的类。这个方式只是修改运行时内存,class文件并没有改变,服务重启就失效了,推荐使用 retransform 命令
monitor	方法执行监控
watch	方法执行数据观测,让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
trace	方法内部调用路径,并输出方法路径上的每个节点上耗时,trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。
stack	输出当前方法被调用的调用路径
tt	方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
profiler	profiler 命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。
cat	打印文件内容,和linux里的cat命令类似。
echo	打印参数,和linux里的echo命令类似
grep	类似传统的grep命令
base64	base64编码转换,和linux里的 base64 命令类似。
tee	类似传统的tee命令, 用于读取标准输入的数据,并将其内容输出成文件。
pwd	返回当前的工作目录,和linux命令类似
auth	验证当前会话
options	系统的配置开关,可开启和关闭

如果输入命令,报了类or方法不存在这种类似的错误,可以使用stop,然后在试一下


  • [ 萱儿AXW ]