一:简介
是Alibaba开源的Java诊断工具
Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
二:安装
1.在服务器下载arthas
wget https://alibaba.github.io/arthas/arthas-boot.jar
2.启动服务
java -jar arthas-boot.jar
启动界面如下:
3.选择对应项目进入arthas下,在启动arthas时候,arthas会去加载当前java的服务,如果部署了多个服务,都会展示出来,输入对应的数字 ,就能进入对应的环境了,如下
备注:我在安装的时候,启动了arthas,总是找不到我java下运行的项目,可以使用 ps -ef|grep java,查看和确认你的项目是否在运行状态中。如果发现项目是在运行中的,可以试着重新启动java服务,然后再启动arthas,这个时候应该就可以看见你的项目了
三:基础命令
dashboard:查看当前系统的实时数据面板,输入q退出面板
jvm:查看当前jvm运行信息
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
-sm -d com.think.controller.UserController userLogin
jad:命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码
-jad com.think.controller.UserController 编译指定类
-jad com.think.controller.UserController userLogin 编译指定类下的方法
thread 显示所有线程信息
- 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
- tt -s 'method.name="userLogin"' 我需要筛选出userLogin 方法的调用信息
watch 方法执行数据观测让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看
-
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