目录
1.安装使用
2.attach一个进程
3.常用命令的接触 dashboard thread
4.jvm相关命令:sysprop sysenv vmoption getstatic ognl
5.class 和classloader相关的命令
阿尔萨斯的使用案例
用户文档:Arthas 用户文档 — Arthas 3.5.6 文档
当你遇到以下类似问题而束手无策时,Arthas
可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从JVM内查找某个类的实例?
1.安装使用
前提:Arthas是一个java的程序,运行前需保证机器上有正在运行的java进程,不然Arthas无法启动
下载Arthas :
curl -O https://arthas.aliyun.com/arthas-boot.jar
启动Arthas:
java -jar arthas-boot.jar
安装在这个目录:
卸载Arthas:
删除两个目录 一个是隐藏的.arthas,一个是logs
2.attach一个进程
先启动一个阿尔萨斯提供的java Demo进程
curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar
然后启动阿尔萨斯去附着这个进程
如果说端口号被占用了 可以使用其他的断就号来执行:
可以用过网页来链接:ip:3658
当我杀死了Arthas
粘附的那个java进程以后 Arthas就自动退出了
3.常用命令的接触 dashboard thread
1.查看dashboard 主要是查看java虚拟机内存显示的一个情况
2.thread命令 查看当前线程信息,查看线程的堆栈
来获取到math-game
进程的Main Class
参数名称 | 参数说明 |
id | 线程id |
[n:] | 指定最忙的前N个线程并打印堆栈 |
[b] | 找出当前阻塞其他线程的线程 |
[i | 指定cpu使用率统计的采样间隔,单位为毫秒,默认值为200 |
[--all] | 显示所有匹配的线程 |
显示出最繁忙的三个线程:thread -n 3
死锁:
查看某一种状态的线程:thread --state RUNNABLE
4.jvm相关命令:sysprop sysenv vmoption getstatic ognl
jvm
THREAD相关
- COUNT: JVM当前活跃的线程数
- DAEMON-COUNT: JVM当前活跃的守护线程数
- PEAK-COUNT: 从JVM启动开始曾经活着的最大线程数
- STARTED-COUNT: 从JVM启动开始总共启动过的线程次数
- DEADLOCK-COUNT: JVM当前死锁的线程数
文件描述符相关
- MAX-FILE-DESCRIPTOR-COUNT:JVM进程最大可以打开的文件描述符数
- OPEN-FILE-DESCRIPTOR-COUNT:JVM当前打开的文件描述符数
sysprop命令 查看系统的属性
sysenv 查看当前JVM的环境属性(System Environment Variables
)
vmoption 查看,更新VM诊断相关的参数
getstatic 查看静态类属性
ognl可以代替getstatic
参数名称 | 参数说明 |
express | 执行的表达式 |
| 执行表达式的 ClassLoader 的 hashcode,默认值是SystemClassLoader |
| 指定执行表达式的 ClassLoader 的 class name |
[x] | 结果对象的展开层次,默认值1 |
调用静态函数:
获取静态类的静态字段:
执行多行表达式,赋值给临时变量,返回一个List:
5.class 和classloader相关的命令
sc:search class命令 查看JVM已加载的类信息
阿尔萨斯的使用案例
netstat -tnlp |grep 9527 查看进程运行的端口号
1.哪个controller处理了请求,
我们可以快速定位一个请求是被Filter拦截的,或者请求最终是由哪个servlet处理的,我们可以精确定位是哪个Controller处理了请求
使用trace命令,trace org.springframework.web.servlet.DispatcherServlet * (按tab补齐)
当我们找到了这个耗时最长的方法后我们接下里要做的就是反编译
jad --source-only org.springframework.web.servlet.DispatcherServlet doDispatch
下一步我们会找什么呢?假设下一步我想知道这个方法的返回内容是什么该怎么办呢?
watch org.springframework.web.servlet.DispatcherServlet getHandler 'returnObj'
这样我们就找到了这个调用的处理器是哪一个了
接下来我们再来最终这个方法的入参和返回值是什么?
watch com.wx.springboot.controller.* * '{params,retuenObj}'
将追踪的深度设置为两级
watch com.wx.springboot.controller.* * '{params,retuenObj}' -x 2