Arthas(阿尔萨斯)的基本使用

目录

1.安装使用

2.attach一个进程

3.常用命令的接触  dashboard   thread

4.jvm相关命令:sysprop  sysenv vmoption getstatic  ognl

5.class 和classloader相关的命令

阿尔萨斯的使用案例


用户文档:Arthas 用户文档 — Arthas 3.5.6 文档

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

  5. 是否有一个全局视角来查看系统的运行状况?

  6. 有什么办法可以监控到JVM的实时运行状态?

  7. 怎么快速定位应用的热点,生成火焰图?

  8. 怎样直接从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 <value>]指定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执行的表达式
[c:]执行表达式的 ClassLoader 的 hashcode,默认值是SystemClassLoader
[classLoaderClass:]指定执行表达式的 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

  

  • 6
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值