基本概念
云杏这么多微服务,当然需要一个诊断利器来排查问题。
Arthas 是阿里开源的挚爱工具,关注开发者开发者。查问题,独立重启跟踪 Java 代码;实时 JVM 在线监控。Arthas 6+,Linux/Mac/Windows,支持 JDK 支持 Java 模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
官方定义为应用诊断利器,从此Javagithub获得了29.4K个star。
可以用来查看线程值,内存,GC异常和运行时,查看入参返回/显示快速应用的提示,生成图等功能,帮助排查难问题。本文主要讲述常见的使用命令。
常见命令
启动arthas-demo(案例程序)
执行如下命令下载arthas-demo.jar
,再用java -jar命令启动程序:
wget https://arthas.aliyun.com/arthas-demo.jar; java -jar arthas-demo.jar
启动arthas-boot(诊断工具程序)
执行如下命令下载arthas-boot.jar
,再用java -jar
命令启动:
wget https://arthas.aliyun.com/arthas-boot.jar; java -jar arthas-boot.jar
arthas是Arthas boot的程序,用户会启动-启动所有的Java进程后,可以选择诊断需要的进程。
选择要诊断的Java程序,我这里输入1,再按回车键(回车)。
附上成功之后,会打印Arthas LOGO。
输入帮助可以获取到阿尔萨斯相关命令帮助信息。
[arthas@1266]$ help NAME DESCRIPTION help Display Arthas Help auth Authenticates the current session keymap Display all the available keymap for the specified connection. sc Search all the classes loaded by JVM sm Search the method of classes loaded by JVM classloader Show classloader info jad Decompile class getstatic Show the static field of a class monitor Monitor method execution statistics, e.g. total/success/failure count, average rt, fail rate, etc. stack Display the stack trace for the specified class and method thread Display thread info, thread stack trace Trace the execution time of specified method invocation. watch Display the input/output parameter, return object, and thrown exception of specified me thod invocation tt Time Tunnel jvm Display the target JVM information memory Display jvm memory info. perfcounter Display the perf counter information. ognl Execute ognl expression. mc Memory compiler, compiles java files into bytecode and class files in memory. redefine Redefine classes. @see Instrumentation#redefineClasses(ClassDefinition...) retransform Retransform classes. @see Instrumentation#retransformClasses(Class...) dashboard Overview of target jvm's thread, memory, gc, vm, tomcat info. dump Dump class byte array from JVM heapdump Heap dump options View and change various Arthas options cls Clear the screen reset Reset all the enhanced classes version Display Arthas version session Display current session information sysprop Display, and change the system properties. sysenv Display the system env. vmoption Display, and update the vm diagnostic options. logger Print logger info, and update the logger level history Display command history cat Concatenate and print files base64 Encode and decode using Base64 representation echo write arguments to the standard output pwd Return working directory name mbean Display the mbean information grep grep command for pipes. tee tee command for pipes. profiler Async Profiler. https://github.com/jvm-profiling-tools/async-profiler vmtool jvm tool stop Stop/Shutdown Arthas server and exit the console.
与linux同样规则的命令此处不再赘述。如:history,cat,echo,pwd,grep。
系统的实时数据面板仪表板命令
仪表板可以命令查看当前系统的实时数据面板。可以查看到 CPU、内存、GC、运行环境等信息。
输入 q 或者 Ctrl+C 可以退出仪表板命令。
打印线程ID的栈线程
thread 1 命令会打印线程ID 1的栈。用thread 1 | grep 'main(' 查找到主类。
查找JVM中已加载的类 sc/sm
可以通过sc命令来查找JVM里已经加载的打印类,通过-d参数,可以出类的具体信息,很方便查找类的加载问题。
[arthas@1266]$ sc -d *MathGame class-info demo.MathGame code-source /home/shell/arthas-demo.jar name demo.MathGame isInterface false isAnnotation false isEnum false isAnonymousClass false isArray false isLocalClass false isMemberClass false isPrimitive false isSynthetic false simple-name MathGame modifier public annotation interfaces super-class +-java.lang.Object class-loader +-sun.misc.Launcher$AppClassLoader@1b6d3586 +-sun.misc.Launcher$ExtClassLoader@107df6e5 classLoaderHash 1b6d3586 Affect(row-cnt:1) cost in 50 ms.
sc支持通配,比如搜索所有的StringUtils:
sc *StringUtils
查找UserController的ClassLoader
[arthas@1266]$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash classLoaderHash 19469ea2
sm命令类似:查找类的具体函数。
sm java.math.RoundingMode
通过 -d 参数可以打印函数的具体属性:
sm -d java.math.RoundingMode
查找特定的函数,例如查找构造函数:
sm java.math.RoundingMode <init>
反编译代码 jad命令
jad demo.MathGame
通过--source-only
参数可以只打印出在反编译的源代码:
jad --source-only com.example.demo.arthas.user.UserController
动态执行代码 ognl 命令
在Arthas里,有一个ognl命令,可以动态执行代码。这个有点秀啊😯😯😯
调用静态函数
ognl '@java.lang.System@out.println("hello ognl")'
获取静态类的物理场
UserController类中的logger获取字段:
ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @com.example.demo.arthas.user.UserController@logger
通过-x参数控制返回值的展开层数。
ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -x 2 @com.example.demo.arthas.user.UserController@logger
多行表达式,给与临时变量执行,返回一个列表
ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'
- OGNL 特殊用法请参考:
https://github.com/alibaba/arthas/issues/71
- OGNL 表达式官方指南:
https://commons.apache.org/proper/commons-ognl/language-guide.html
查看函数的参数/异常信息 watch 命令/返回值
watch demo.MathGame primeFactors returnObj
查看JVM信息 sysprop sysenv jvm仪表板
系统道具
- sysprop :打印所有的
System Properties
信息。 - 指定密钥:
sysprop user.dir
。 - 通过grep过滤:
sysprop | grep user
。 - 设置新的价值:
sysprop testKey testValue
。
系统环境
sysenv 命令可以类似地获取到环境变量。和 sysprop 命令。
虚拟机
jvm 命令会打印出 JVM 的各种详细信息。
仪表板
仪表板可以命令查看当前系统的实时数据面板。
重置类重置命令
通过reset命令可以还原类,将Arthas过码的类全部关闭,Arthas增强服务端时会重置所有过的类。Arthas在等命令的时候watch/trace
,其实是应用的字节修改,插入的增强代码。显式执行重置命令,可以清除掉这些增强代码。
reset 指定类:
reset demo.MathGame
所有还原类:
reset
查看当前会话信息会话
tee 命令
传统的 tee 命令类似用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
查看当前Arthas版本
[arthas@1710]$ version 3.6.2
退出阿尔萨斯
输入退出或退出命令可以退出阿尔萨斯当前会话。执行命令停止彻底退出阿尔萨斯。
📌PS:所有命令都可以通过 -h 参数查看帮助信息。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能