基础命令
rest:将增强过的类进行还原,后面可以带参数来进行过滤操作,服务器关闭时候会自动重置
trace:追踪某个包下面的某个类
history:历史命令
quti:退出
keymap: 展示快捷键
jvm相关命令
dashboard 仪表板
thread 线程相关
jvm 相关信息
sysprop
sysenv 系统环境
getstatic
getstatic 类名 属性名 获取
ognl命令
class/classloader相关命令
sc:
search class
sm:
search method
💡jad:
#先反编译出java代码,后面的queryPatinfo是方法名,如果不写的话就是编译整个类,否则就是只有当前方法;如果前面没有–source-only,则不会显示类路径和类加载器,,,文件默认保存在opt下面
jad --source-only cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl > queryPatinfo
#再对代码进行编辑
vi queryPatinfo
#查找类加载器
sc -d cn.swifthealth.sync.api.dbmonitor.service.DbStatusServiceImpl | grep classLoaderHash
#编译为class文件,-d后面是保存的路径
mc -c 49c2faae /opt/queryPatinfo -d /opt
#热更新
redefine queryPatinfo.cal
#说明:当新增/删除field/method时,redefine会有失败的可能性,如果当前执行的方法一直在运行也会导致无法生效
💡 watch命令
# watch命令:
# 查看某个方法的入参和返回值:
watch cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo {params,returnObj} -x 4
# 示例: watch 类路径 方法名 {参数和返回值} 遍历深度
# 说明: 如果只需要展示参数或者返回值,则直接写出来,不用大括号括起来,如果需要返回多个信息则需要括起来,-x 和后面的数字,表示遍历的深度,如果深度不够则返回的是一个model,控制台只能看到类的路径,只有达到深度才能返回具体的返回值,下面分支列出深度为2和4时候的返回值
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 函数名表达式匹配 |
express | 观察表达式,默认值:{params, target, returnObj} |
condition-express | 条件表达式 |
[b] | 在函数调用之前观察 |
[e] | 在函数异常之后观察 |
[s] | 在函数返回之后观察 |
[f] | 在函数结束之后(正常返回和异常返回)观察 |
[E] | 开启正则表达式匹配,默认为通配符匹配 |
[x:] | 指定输出结果的属性遍历深度,默认为 1 |
???
watch cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo {params,returnObj} 'params[1]="abc"' -x 3
通过在需要返回的内容后面加 ’’ ,里面写上过滤的条件来实现只展示指定的内容,,,,这块有个问题就是如何根据入参某个字段是某个值来进行过滤
要过滤的结果用target表示,然后具体字段用target.属性名表示。
--查入参
watch cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo params -x 2 -b
--按照耗时进行过滤
watch cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo '{params,returnObj}' '#cost>10' -x
dump
#dump 类路径,将编译后的类保存到一个以类加载器为名字的文件夹中,可以进行访问
dump cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl
montor
#监视某个类下的某个方法在指定时间段内的调用情况, -c 表示cycle,即间隔多久当做一个周期,如果不写默认是120s,-c 3表示3s一个监视周期
monitor cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo -c 3
💡trace
#[n: ] 设置命令执行次数; -n 5 表示监视5次方法的调用,不写的话就是调用几次方法,追踪几次 (可以不写)
trace cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo -n 5
#cost 方法执行耗时,单位是毫秒 ‘#cost > 100’ 表示只对耗时超过100ms的执行进行监视 (可以不写)
trace cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo '#cost > 100'
stack
#[E] 正则表达式匹配
和trace类似
#[n: ] 调用次数
和trace类似
tt
tt的参数 | 说明 |
---|---|
-t | 记录一个方法在一个时间段中的调用 |
-l | 显示所有已经记录的列表 |
-n | 只记录次数 |
-s | 搜索表达式 |
-i | 查看指定索引号的详细调用信息 |
tt -t cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo
火焰图
# 启动报错
[arthas@1]$ profiler start
Perf events unavailable. See stderr of the target process.
perf_event_open() syscall has failed. The error message is printed to the error stream of the target JVM.
# 问题原因
Typical reasons include:
/proc/sys/kernel/perf_event_paranoid is set to restricted mode (>=2).
/proc/sys/kernel/perf_event_paranoid 设置为受限模式(> = 2)
# 问题解决
# 从Linux4.6开始,如果需要使用非root用户启动的进程中的perf_events,捕获内核调用堆栈的信息,需要设置两个系统运行时变量,可以使用sysctl或按如下方式设置它们:
echo 1 > /proc/sys/kernel/perf_event_paranoid
echo 0 > /proc/sys/kernel/kptr_restrict
- profile start 启动火焰图
- profile getSample 获取样本
- profile list 样本列表
- profile status 样本获取状态