目录

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进程 arthas classloader_开发语言

启动Arthas:

java -jar arthas-boot.jar 

安装在这个目录:

Arthas 看不着java进程 arthas classloader_JVM_02

Arthas 看不着java进程 arthas classloader_java_03

卸载Arthas:

 删除两个目录  一个是隐藏的.arthas,一个是logs

Arthas 看不着java进程 arthas classloader_开发语言_04

2.attach一个进程

先启动一个阿尔萨斯提供的java Demo进程

curl -O https://arthas.aliyun.com/math-game.jar

java -jar math-game.jar

Arthas 看不着java进程 arthas classloader_Arthas 看不着java进程_05

然后启动阿尔萨斯去附着这个进程

Arthas 看不着java进程 arthas classloader_jar_06

如果说端口号被占用了 可以使用其他的断就号来执行:

Arthas 看不着java进程 arthas classloader_Arthas 看不着java进程_07

可以用过网页来链接:ip:3658

Arthas 看不着java进程 arthas classloader_java_08

Arthas 看不着java进程 arthas classloader_JVM_09

Arthas 看不着java进程 arthas classloader_java_10

当我杀死了Arthas粘附的那个java进程以后 Arthas就自动退出了

Arthas 看不着java进程 arthas classloader_Arthas 看不着java进程_11

3.常用命令的接触  dashboard   thread

   1.查看dashboard   主要是查看java虚拟机内存显示的一个情况

Arthas 看不着java进程 arthas classloader_JVM_12

2.thread命令  查看当前线程信息,查看线程的堆栈

来获取到math-game进程的Main Class

参数名称

参数说明

id

线程id

[n:]

指定最忙的前N个线程并打印堆栈

[b]

找出当前阻塞其他线程的线程

[i <value>]

指定cpu使用率统计的采样间隔,单位为毫秒,默认值为200

[--all]

显示所有匹配的线程

Arthas 看不着java进程 arthas classloader_java_13

显示出最繁忙的三个线程:thread -n 3

Arthas 看不着java进程 arthas classloader_jar_14

死锁:

Arthas 看不着java进程 arthas classloader_jar_15

Arthas 看不着java进程 arthas classloader_java_16

 查看某一种状态的线程:thread --state RUNNABLE

 

Arthas 看不着java进程 arthas classloader_java_17

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

jvm 

Arthas 看不着java进程 arthas classloader_java_18

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命令 查看系统的属性

Arthas 看不着java进程 arthas classloader_java_19

sysenv  查看当前JVM的环境属性(System Environment Variables)

Arthas 看不着java进程 arthas classloader_开发语言_20

 vmoption  查看,更新VM诊断相关的参数

Arthas 看不着java进程 arthas classloader_JVM_21

getstatic  查看静态类属性 

Arthas 看不着java进程 arthas classloader_开发语言_22

ognl可以代替getstatic 

参数名称

参数说明

express

执行的表达式

[c:]

执行表达式的 ClassLoader 的 hashcode,默认值是SystemClassLoader

[classLoaderClass:]

指定执行表达式的 ClassLoader 的 class name

[x]

结果对象的展开层次,默认值1

调用静态函数:

Arthas 看不着java进程 arthas classloader_jar_23

 获取静态类的静态字段:

Arthas 看不着java进程 arthas classloader_jar_24

 执行多行表达式,赋值给临时变量,返回一个List:

Arthas 看不着java进程 arthas classloader_jar_25

5.class 和classloader相关的命令

 sc:search class命令  查看JVM已加载的类信息

阿尔萨斯的使用案例

    netstat -tnlp |grep 9527  查看进程运行的端口号

  1.哪个controller处理了请求,

      我们可以快速定位一个请求是被Filter拦截的,或者请求最终是由哪个servlet处理的,我们可以精确定位是哪个Controller处理了请求

   使用trace命令,trace org.springframework.web.servlet.DispatcherServlet *  (按tab补齐)

Arthas 看不着java进程 arthas classloader_Arthas 看不着java进程_26

 当我们找到了这个耗时最长的方法后我们接下里要做的就是反编译

 jad --source-only org.springframework.web.servlet.DispatcherServlet doDispatch

Arthas 看不着java进程 arthas classloader_JVM_27

下一步我们会找什么呢?假设下一步我想知道这个方法的返回内容是什么该怎么办呢?

Arthas 看不着java进程 arthas classloader_jar_28

watch org.springframework.web.servlet.DispatcherServlet getHandler 'returnObj' 

这样我们就找到了这个调用的处理器是哪一个了

Arthas 看不着java进程 arthas classloader_JVM_29

接下来我们再来最终这个方法的入参和返回值是什么?

watch com.wx.springboot.controller.* *  '{params,retuenObj}'

将追踪的深度设置为两级

watch com.wx.springboot.controller.* *  '{params,retuenObj}' -x 2