使用arthas排查线上问题
背景arthas是阿里开源的Java排查工具。使用JVMTI等技术实现对JVM底层的一些监控,例如idea的DEBUG技术就是依赖这个,所以这是JVM的一个“后门”。问题线上出现问题,很多时候由于日志的缺失,或则是监控的维度等等问题无法立即排查真实的情况。使用方式这次我们来分析使用arthas来查看spring容器的一个操作,可以任意的查看Spring容器的任何信息。...
-
背景
arthas是阿里开源的Java排查工具。使用JVMTI等技术实现对JVM底层的一些监控,例如idea的DEBUG技术就是依赖这个,所以这是JVM的一个“后门”。 -
问题
线上出现问题,很多时候由于日志的缺失,或则是监控的维度等等问题无法立即排查真实的情况。 -
使用方式
这次我们来分析使用arthas来查看spring容器的一个操作,可以任意的查看Spring容器的任何信息。
- 安装
首先下载并安装arthas:
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
启动选择需要附着的PID。然后进入该Java进程的arthas命令界面。
介绍一下tt命令(TimeTerminal),方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。
可以带-t命令,追加指定的方法,这样就能定向的追踪方法。 例如tt -t com.xxx.xxx methodName
但是很多时候调用量很大,我们只需要指定的次数,可以再加参数-n ,例如tt -t -n 3 com.xxx.xxx methodName,这样就只打印三次调用的信息。
-i 命令可以让我们重复调用而不依赖上游,
-w 可以调用到指定的方法。
这次我们只需要这些命令就够了,其他的更多命令可以查看官方文档。https://alibaba.github.io/arthas/tt.html
- 开始操作
启动java应用
然后执行(如果没有,先下载):java -jar arthas-boot.jar
选择刚启动应用的pid进入arthas命令界面
然后执行监听:
tt -t -n 3 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
首先一个前提是准备一个应用的http接口,在机器上调用curl调用,可以看到控制台输出调用信息.
然后看到如下的输出,找到index可以进入隧道执行一些操作,例如获取到spring容器:
tt -i 1000 -w 'target.getApplicationContext()"
当然也可以获取bean:
tt -i 1000 -w 'target.getApplicationContext().getBean(“redisClient”).variableName
这样可以访问实例变量
要是访问静态变量可以直接
getstatic [类全路径] 变量名
- 其他有价值的命令
- jad可以反编译线上代码,很多时候发现代码是不是部署的预期的分支,可以用这个
jad 包类名 - getstatic可以获取静态变量的值.非常方便
getstatic 包类名 静态变量名 - stack 可以查看方法调用的堆栈,很多时候不知道为什么是怎样的调用的路径可以用这个
stock -n 包类名 方法 - watch 非常有价值的命令,可以看到任何方法的入参和返回
- jvm 查看jvm的相关参数
ognl 表达式? - mc 和 redefine 可以实现热加载的效果
使用mc 类Path路径 输出class文件
再用redefine 重新读class即可。 - dashboard 大盘
更多推荐
所有评论(0)