Java 诊断工具 Arthas 常见命令
基本概念
云原生这么多微服务,当然需要一个诊断利器来排查问题。
Arthas 是阿里开源的 Java 诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪 Java 代码;实时监控 JVM 状态。Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
官网:https://arthas.aliyun.com/
官方定义为Java应用诊断利器,截至目前github收获29.4K个star。
可以用来查看线程,内存,GC和运行时状态,查看入参/返回值/异常,快速定位应用的热点,生成火焰图等功能,帮助更快排查疑难问题。本文主要讲述常见命令的使用。
常见命令
启动arthas-boot(诊断工具程序)
执行如下命令下载arthas-boot.jar
,再用java -jar
命令启动:
arthas-boot是Arthas的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。
选择要诊断的Java程序,我这里输入 1 ,再按回车键(Enter)。
Attach成功之后,会打印Arthas LOGO
输入 help 可以获取到Arthas相关命令帮助信息。
与linux
同样规则的命令此处不再赘述。如:history,cat,echo,pwd,grep
。
系统的实时数据面板 dashboard 命令
输入dashboard
命令可以查看当前系统的实时数据面板。
可以查看到CPU、内存、GC、运行环境等信息。
输入q 或者 Ctrl+C
可以退出dashboard
命令。
打印线程ID 的栈 thread
thread 1 命令会打印线程ID 1的栈。用 thread 1 | grep ‘main(‘ 查找到main class。
查找JVM里已加载的类 sc/sm
可以通过 sc 命令来查找JVM里已加载的类,通过-d参数,可以打印出类加载的具体信息,很方便查找类加载问题。
可以通过 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命令,可以动态执行代码。这个有点秀啊😯😯😯
调用static函数
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
执行多行表达式,赋值给临时变量,返回一个List
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 dashboard
sysprop
- sysprop :打印所有的
System Properties
信息。 - 指定单个key:
sysprop user.dir
。 - 通过grep过滤 :
sysprop | grep user
。 - 设置新的value:
sysprop testKey testValue
。
sysenv
sysenv
命令可以获取到环境变量。和sysprop
命令类似。
jvm
jvm
命令会打印出JVM的各种详细信息。
dashboard
dashboard
命令可以查看当前系统的实时数据面板。
重置增强类 reset 命令
通过reset命令可以重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类。Arthas在 watch/trace
等命令时,实际上是修改了应用的字节码,插入增强的代码。显式执行 reset 命令,可以清除掉这些增强代码。
reset 还原指定类:
reset demo.MathGame
还原所有增强类:
reset
查看当前会话信息 session
tee 命令
类似传统的tee
命令 用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
查看当前Arthas版本 version
退出Arthas
输入 exit 或者 quit
命令可以退出Arthas当前session。执行 stop 命令彻底退出Arthas。
参考来源:blog.csdn.net/qq_35427589/article/details/125331696