Arthas 入门指南
2021-06-03 21:08:55 3 举报
AI智能生成
Arthas 入门指南
作者其他创作
大纲/内容
基础命令
help
查看命令帮助信息
cat
打印文件内容,和linux里的cat命令类似
echo
打印参数,和linux里的echo命令类似
grep
匹配查找,和linux里的grep命令类似
base64
base64编码转换,和linux里的base64命令类似
tee
复制标准输入到标准输出和指定的文件,和linux里的tee命令类似
pwd
返回当前的工作目录,和linux命令类似
cls
清空当前屏幕区域
session
查看当前会话的信息
reset
重置增强类
version
输出当前目标 Java 进程所加载的 Arthas 版本号
history
打印命令历史
quit
退出当前 Arthas 客户端
其他 Arthas 客户端不受影响
stop
关闭 Arthas 服务端
所有 Arthas 客户端全部退出
keymap
Arthas快捷键列表及自定义快捷键
jvm相关
dashboard
当前系统的实时数据面板
说明
列定义
内部线程
分布图
thread
查看当前 JVM 的线程堆栈信息
线程状态图
使用参考
thread -n 3
展示当前最忙的前3个线程
thread
默认显示第一页,按CPU 增量时间降序
thread –all
显示所有匹配的线程
thread 1
显示指定线程的运行堆栈
thread -b
找出当前阻塞其他线程的线程
仅支持synchronized
thread -i 1000
指定采样时间间隔1000ms
thread -n 3 -i 1000
列出1000ms内最忙的3个线程栈
thread --state WAITING
查看指定状态的线程
jvm
查看当前 JVM 的信息
sysprop
查看和修改JVM的系统属性
sysenv
查看JVM的环境变量
vmoption
查看和修改JVM里诊断相关的option
使用参考
查看
vmoption
vmoption PrintGCDetails
修改
vmoption PrintGCDetails true
perfcounter
查看当前 JVM 的Perf Counter信息
logger
查看和修改logger
getstatic
查看类的静态属性
ognl
执行ognl表达式
mbean
查看 Mbean 的信息
heapdump
dump java heap, 类似jmap命令的heap dump功能
使用参考
heapdump /tmp/dump.hprof
dump到指定文件
heapdump --live /tmp/dump.hprof
只dump live对象
vmtool
从jvm里查询对象,执行forceGc
演示资源
MathGame
线程WAITING
效果
子主题
class/classloader相关
sc
Search-Class,查看JVM已加载的类信息
默认开启了子类匹配功能
使用参考
sc demo.*
模糊搜索
sc -d demo.MathGame
打印类的详细信息
sc -d -f demo.MathGame
打印出类的Field信息
sm
Search-Method,查看已加载类的方法信息
使用参考
sm java.lang.String
查看指定类下所有方法
sm -d java.lang.String toString
查看指定方法的详情
jad
反编译指定已加载类的源码
使用参考
jad java.lang.String
反编译指定类
jad --source-only demo.MathGame
反编译时只显示源代码
jad demo.MathGame main
反编译指定的函数
jad demo.MathGame main --lineNumber false
反编译时不显示行号
mc
Memory Compiler 内存编译器,内存编译.java文件为.class文件
使用参考
mc /tmp/Test.java
内存编译.java文件为.class文件
mc -c 327a647b /tmp/Test.java
可以通过-c参数指定classloader
mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp
也可以通过--classLoaderClass参数指定ClassLoader
mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java
可以通过-d命令指定输出目录
retransform
加载外部的.class文件,retransform到JVM里
使用参考
retransform /tmp/MathGame.class
加载指定的 .class 文件,然后解析出class name,再retransform jvm中已加载的对应的类
retransform -l
查看 retransform entry
retransform -d 1
删除指定 retransform entry
retransform --deleteAll
删除所有 retransform entry
retransform --classPattern demo.MathGam
显式触发 retransform
消除 retransform 的影响
1、删除这个类对应的 retransform entry
2、重新触发 retransform
上传 .class 文件到服务器的技巧
retransform的限制
redefine
加载外部的.class文件,redefine到JVM里
推荐使用 retransform 命令
dump
dump 已加载类的 byte code 到特定目录
使用参考
classloader
查看classloader的继承树,urls,类加载信息,使用classloader去getResource
使用参考
monitor/watch/trace相关
monitor
方法执行监控
非实时返回命令
Ctrl+C 退出
使用参考
monitor -c 5 demo.MathGame primeFactors
monitor -c 5 demo.MathGame primeFactors "params[0] <= 2"
计算条件表达式过滤统计结果(方法执行完毕之后)
monitor -b -c 5 com.test.testes.MathGame primeFactors "params[0] <= 2"
计算条件表达式过滤统计结果(方法执行完毕之前)
watch
方法执行数据观测
使用参考
watch demo.MathGame primeFactors "{params,returnObj}" -x 2
观察方法出参和返回值
watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b
观察方法入参
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2
同时观察方法调用前和方法返回后
watch demo.MathGame primeFactors "{params,target}" -x 3
调整-x的值,观察具体的方法参数值
watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"
条件表达式的例子
watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2
观察异常信息的例子
watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2
按照耗时进行过滤
watch demo.MathGame primeFactors 'target'
观察当前对象中的属性
watch demo.MathGame primeFactors 'target.illegalArgumentCount'
然后使用target.field_name访问当前对象的某个属性
watch demo.MathGame * '{params,@demo.MathGame@random.nextInt(100)}' -n 1 -x 2
获取类的静态字段、调用类的静态方法的例子
watch javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter
排除掉指定的类
不匹配子类
options disable-sub-class true
使用 -v 参数打印更多信息
watch -v -x 2 demo.MathGame print 'params' 'params[0] > 100000'
trace
方法内部调用路径,并输出方法路径上的每个节点上耗时
使用参考
trace demo.MathGame run
trace函数
trace demo.MathGame run -n 1
trace次数限制
trace --skipJDKMethod false demo.MathGame run
包含jdk的函
trace demo.MathGame run '#cost > 10'
据调用耗时过滤
trace -E com.test.ClassA|org.test.ClassB method1|method2|method3
trace多个类或者多个函数
trace javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter
排除掉指定的类
trace demo.MathGame primeFactors --listenerId 1
动态trace
trace结果时间不准确问题
没有被trace到的函数
非函数调用的指令消耗
在代码执行过程中,JVM可能出现停顿
stack
输出当前方法被调用的调用路径
使用参考
stack demo.MathGame primeFactors
stack demo.MathGame primeFactors 'params[0]<0' -n 2
据条件表达式来过滤(参数<0,执行2次)
stack demo.MathGame primeFactors '#cost>5'
据执行时间来过滤(耗时>5秒)
tt
TimeTunnel,方法执行数据的时空隧道
使用参考
其它
profiler/火焰图
auth–鉴权
options—Arthas全局开关
options
查看所有的options
options json-format
获取option的值
options save-result true
设置指定的option
options unsafe true
打开unsafe开关,支持jdk package下的类
管道
grep
搜索满足条件的结果
plaintext
将命令的结果去除ANSI颜色
wc
按行统计输出结果
后台异步任务
1. 使用&在后台执行任务
2. 通过jobs查看任务
3. 任务暂停和取消
4. fg、bg命令,将命令转到前台、后台继续执行
5. 任务输出重定向
6. 停止命令
7. 其他
0 条评论
下一页