前言
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
1、安装
curl -O https://arthas.aliyun.com/arthas-boot.jar
2、启动
java -jar arthas-boot.jar
执行选择java进程
我选择了第2个进程,输入2,然后按enter 键进入
3、常见命令
dashboard
输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。
可以结合thread使用,检查占用cpu高的线程。
thread
查看当前线程信息,查看线程的堆栈
sm
“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。
sm 命令只能看到由当前类所声明 (declaring) 的方法,父类则无法看到。
sm java.lang.String
SC
“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,这个命令支持的参数有 [d]、[E]、[f] 和 [x:]。
如:打印类的详细信息
sc -d demo.MathGame
class-info demo.MathGame
code-source /private/tmp/math-game.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@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
classLoaderHash 3d4eac69
Affect(row-cnt:1) cost in 875 ms.
monitor
方法监控,可以查看方法执行次数以及平均耗时
以下为监控HelloController 的hello方法, 每30s输出一次结果
monitor com.tlk.controller.HelloController hello -c 30
jad
jad反编译指定已加载类的源码,可以查看代码是否最新的。
heapdump
dump java heap, 类似 jmap 命令的 heap dump 功能。
生成文件在arthas-output目录,可以通过浏览器下载: http://localhost:8563/arthas-output/
history
历史指令会通过一个名叫 history 的文件持久化,所以 history 指令可以查看当前 arthas 服务器的所有历史命令,而不仅只是当前次会话使用过的命令。 当用的次数多了,常用命令还是挺有用的。
logger
查看 logger 信息,更新 logger level
查询日志级别
指定 classloader 更新 logger level
默认情况下,logger 命令会在 SystemClassloader 下执行,如果应用是传统的 war 应用,或者 spring boot fat jar 启动的应用,那么需要指定 classloader。
可以先用 sc -d yourClassName 来查看具体的 classloader hashcode,然后在更新 level 时指定 classloader:
更新logger level
logger -c 21b8d17c --name ROOT --level debug
memory
查看进程内容使用情况
trace
方法内部调用路径,并输出方法路径上的每个节点上耗时
这个demo比较有意思,日志级别配置的info,但是实际还是会执行debug的,所以debug不要随便打,如果需要的话,加上isDebugEnabled的判断
//条件判断
if(logger.isDebugEnabled){
logger.debug("server info , id : " + id + ", user : " + user);
}
stack
输出当前方法被调用的调用路径
vmoption
查看,更新 VM 诊断相关的参数
查询vm参数
更改vm参数
案例
案例1: cpu 100%
thread 查看线程CPU占比,查看其中cpu使用占比过高的数据
thread pid查看线程堆栈
案例2: 某个接口耗时比较高
使用trace去查看具体的耗时,trace demo.MathGame *
案例3:查询内存过高
输入deashboard 或者 memory 命令查看内容情况
heapdump 出内存快照
导出后就使用jvisualvm或mat进行分析。