命令:
表达式常用变量:params 入参数组(params0)、 returnObj返回值、 throwExp异常、 target this(实例字段:target.someField)、#cost耗时ms。末尾还能跟条件表达式,比如只要返回非空:'returnObj' 'returnObj.size()>0'
平时用的比较多的是
| bash | |
|---|---|
| dashboard | 总览:线程CPU/内存/GC |
| thread | 线程列表按CPU排序 |
| thread | 看某线程堆栈;thread -b 直接找死锁 |
| sc -d *InstanceResult | 搜类,谁加载的、jar路径(classloader问题查这个) |
| sm 类 方法 | 搜方法存在性 |
| trace 类 方法 | 方法内部调用链 + 每步耗时,查"慢在哪"首选 |
| watch 类 方法 '{params,returnObj,throwExp}' -x 2 | 看入参,返回,异常 |
| watch 类 方法 'returnObj' -b | -b入口时看,默认返回时;-e异常时;-s成功时 |
| stack 类 方法 | 反向,谁调用了这个方法(不知道入口在哪时神器) |
| tt -t 类 方法 | 时空隧道录现场,事后可回放 |
| tt -l /tt -i 1000 -w 'target.params' / tt -i 1000 -r | 列表/查看/重放调用 |
| jad类 --source-path / tmp | 反编译线上实际运行的代码(怀疑部署版本不对时用) |
| ognl '@java.lang.System@getProperty("user.home")' | 静态求值/调静态方法 |
| vmtool --action getInstances --className 类 --express 'instances0.field' | 直接从堆里抓一个现存对象看字段,watch 抓不到的"已存在的值"用它 |
| logger --name ROOT --level debug | 线上临时改日志级别 |
| profiler start / stop --format html | 火焰图,CPU 热点 |
| heapdump /tmp/dump.hprof | 导堆给 MAT 分析 |
| reset 类 / stop | 探针 / 彻底卸载 |
慢 → trace;
值 → watch/tt;
谁调的 → stack;
调用方未知类加载异常 → sc -d;
线上代码是不是我看的这份 → jad