• 背景
    arthas是阿里开源的Java排查工具。使用JVMTI等技术实现对JVM底层的一些监控,例如idea的DEBUG技术就是依赖这个,所以这是JVM的一个“后门”。

  • 问题
    线上出现问题,很多时候由于日志的缺失,或则是监控的维度等等问题无法立即排查真实的情况。

  • 使用方式
    这次我们来分析使用arthas来查看spring容器的一个操作,可以任意的查看Spring容器的任何信息。

  1. 安装
    首先下载并安装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

  1. 开始操作
    启动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 [类全路径] 变量名

  • 其他有价值的命令
  1. jad可以反编译线上代码,很多时候发现代码是不是部署的预期的分支,可以用这个
    jad 包类名
  2. getstatic可以获取静态变量的值.非常方便
    getstatic 包类名 静态变量名
  3. stack 可以查看方法调用的堆栈,很多时候不知道为什么是怎样的调用的路径可以用这个
    stock -n 包类名 方法
  4. watch 非常有价值的命令,可以看到任何方法的入参和返回
  5. jvm 查看jvm的相关参数
    ognl 表达式?
  6. mc 和 redefine 可以实现热加载的效果
    使用mc 类Path路径 输出class文件
    再用redefine 重新读class即可。
  7. dashboard 大盘
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐