今天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自己调用下。
基础命令 说明
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 ]