Arthas
官方的工具还不够足够的简单,需要记住一些命令,特别是一些扩展性特别强的高级语法,比如ognl
获取spring context
为所欲为,watch
、trace
不够简单,需要构造一些命令工具的信息,因此只需要一个能够简单处理字符串信息的插件即可使用。当在处理线上问题的时候需要最快速、最便捷的命令,因此插件还是有存在的意义和价值的。
arthas idea plugin
更简单的使用 arthas
的 IDEA 插件,方便的构建各种 arthas
命令,复制到剪切板 然后到服务器上启动 arthas
执行命令
可以直接去 idea 插件仓库下载安装 https://plugins.jetbrains.com/plugin/13581-arthas-idea/
将光标放置在具体的类、字段、方法上面 右键选择需要执行的命令,部分会有窗口弹出、根据界面操作获取命令;部分直接获取命令复制到了剪切板 ,自己启动 arthas
后粘贴命令即可执行。
由于手拼 arthas
的命令很长,很麻烦,所以插件作用的一方面就是帮我们生成这些命令,直接在 arthas
执行就好了。
以下命令都是借助 arthas idea 插件直接生成的,不用自己拼
1 查看具体类中方法的入参、出参、异常
比如 要查看以下方法的执行情况:
watch com.demo.meal.pc.MealManagerController listMealCategoryByOptions '{params,returnObj,throwExp}' -n 5 -x 3
也可根据条件表达式来观察,比如
## 判断当第一个请求参数为 1 的时候
watch com.demo.meal.pc.MealManagerController listMealCategoryByOptions '{params,returnObj,throwExp}' "params[0]==1" -n 5 -x 3
2 trace 跟踪请求链路
trace com.demo.meal.pc.MealManagerController listMealCategoryByOptions -n 5 --skipJDKMethod false
3 查看调用栈
stack com.demo.meal.pc.MealManagerController listMealCategoryByOptions -n 5
4 监控方法执行情况
monitor com.demo.meal.pc.MealManagerController listMealCategoryByOptions -n 10 --cycle 10
5 反编译源码并显示行号
jad --source-only com.demo.meal.pc.MealManagerController listCategoryTrainByOptions
6 查看 JVM 已加载的类信息
sc -d com.demo.meal.pc.MealManagerController
7 查看已加载类的方法信息
sm -d com.demo.meal.pc.MealManagerController listCategoryTrainByOptions
8 动态修改日志级别
先看一下当前日志信息
通过命令修改:
logger --name ROOT --level debug
9 dump 已加载类的 bytecode(.class文件) 到特定目录
dump com.demo.meal.pc.MealManagerController -d /Users/hh/logs/arthas/dump
10 生成火焰图
什么是火焰图? 怎么看懂?
参考:https://www.ruanyifeng.com/blog/2017/09/flame-graph.html
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
## 采集 alloc 火焰图 30秒后自动结束
profiler start --event alloc --interval 10000000 --threads --format svg -duration 30 --threads
## 采集 CPU 火焰图 30秒后自动结束
profiler start --event cpu --interval 10000000 --threads --format svg -duration 30 --threads