arthas学习笔记

一:简介
是Alibaba开源的Java诊断工具
Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?

二:安装
1.在服务器下载arthas

wget https://alibaba.github.io/arthas/arthas-boot.jar

2.启动服务

java -jar arthas-boot.jar

启动界面如下:

3.选择对应项目进入arthas下,在启动arthas时候,arthas会去加载当前java的服务,如果部署了多个服务,都会展示出来,输入对应的数字 ,就能进入对应的环境了,如下


image.png

备注:我在安装的时候,启动了arthas,总是找不到我java下运行的项目,可以使用 ps -ef|grep java,查看和确认你的项目是否在运行状态中。如果发现项目是在运行中的,可以试着重新启动java服务,然后再启动arthas,这个时候应该就可以看见你的项目了

三:基础命令
dashboard:查看当前系统的实时数据面板,输入q退出面板


image.png

jvm:查看当前jvm运行信息


image.png

sc:查看JVM已加载的类信息“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息

  • sc com.think.controller.* 模糊搜索com.think.controller包下所有的类


    image.png
  • sc -d com.think.controller.UserController 打印类的详细信息


    image.png

sm:查看已加载类的方法信息,“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息,只能看到由当前类所声明 (declaring) 的方法,父类则无法看到
-sm com.think.controller.UserController


image.png

-sm -d com.think.controller.UserController userLogin


image.png

jad:命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码
-jad com.think.controller.UserController 编译指定类
-jad com.think.controller.UserController userLogin 编译指定类下的方法


image.png

thread 显示所有线程信息


image.png
  • thread 12 按照线程id去查看线程具体信息
  • thread -n 4 展示当前最忙的前4个线程并打印堆栈
  • thread -b 找出当前阻塞其他线程的线程
  • thread –state WAITING 查看指定状态(waiting状态)的线程

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

  • trace com.think.controller.UserController userLogin


    image.png
  • trace com.think.controller.UserController userLogin -n 1 trace次数限制

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

  • stack com.think.controller.UserController userLogin


    image.png

tt

  • tt -t com.think.controller.UserController userLogin 记录下当前方法的每次调用环境现场


    image.png
image.png
  • tt -s 'method.name="userLogin"' 我需要筛选出userLogin 方法的调用信息

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


image.png
  • watch com.think.controller.UserController userLogin "{params,returnObj}" -x 2 观察方法出参和返回值


    image.png
  • watch com.think.controller.UserController userLogin "{params,returnObj}" -x 2 -b 观察方法入参
    -watch com.think.controller.UserController userLogin "{params,returnObj}" -x 2 -b -s -n 2 同时观察方法调用前和方法返回后,参数里-n 2,表示只执行两次这里输出结果中,第一次输出的是方法调用前的观察表达式的结果,第二次输出的是方法返回后的表达式的结果结果的输出顺序和事件发生的先后顺序一致,和命令中 -s -b 的顺序无关

  • watch com.think.controller.UserController userLogin "{params,returnObj}" -x -3 调整-x的值,观察具体的方法参数值

文档参考:https://alibaba.github.io/arthas/watch.html
实战参考:https://github.com/alibaba/arthas/issues?page=1&q=label%3Auser-case

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。