问题跟踪利器arthas所有命令,黄色划线的是我经常用到的,其中trace、watch、getstatic和ognl四个命令在跟踪问题时候非常强大,本文主要记录部分常用和重要的命令,其他基础命令和出场率不高的命令可以随时在官网查看:
具体解释参考以下官网文档,这里只列出我自己常用到的命令,一是系统整理总结经验,二是为了后面查找方便。
arthas官网文档https://arthas.aliyun.com/doc/commands.html
- 确认jvm中运行的class文件是否和预期的一致,反编译class - jad
jad com.xxx.xxx.Cache xxxMethod
- 跟踪方法耗时 - trace
trace org.apache.commons.lang.StringUtils isBlank '#cost>100'
- 查看方法的入参或返回值信息 - watch
watch org.apache.commons.lang.StringUtils isBlank '{params, target, returnObj, throwExp}' -x 2 watch *StringUtils isBlank params[0] params[0].length==1 watch *StringUtils isBlank params '#cost>100' // 根据参数条件watch,注意Long类型要L后缀 watch com.xxx.xxx.DataService xxxMethodName '{params[2]}' 'params[1].equals(1905187677257728L)' -x 4 // 当出现异常时watch -e XXXException
- 查看类变量具体信息或属性 - getstatic
# 很多缓存信息定义为类变量,可以通过以下方法查看缓存的信息 getstatic com.xxx.xxx.Cache XxxMap // 查看全部缓存 getstatic com.xxx.xxx.Cache XxxMap 'entrySet().iterator.{? #this.key=="9527"}' // 查看map中某个key对应的entry信息 getstatic com.xxx.xxx.Cache XxxMap 'size()' // 查看map大小
- 调用静态方法 - ognl
ognl '@java.lang.System@out.println("hello")' # 通过hashcode指定ClassLoader sc -d com.xxx.xxx.XxxService | grep -v hashcode // 得到ClassLoader的hashcode ognl '@com.xxx.xxx.XxxService@setEncodeConf(true)' // 调用springbean的静态方法修改配置
- 查看spring-bean的属性
ognl -c 7ef20235 '@com.xxx.xxx.common.util.spring.SpringUtil@getBean("serviceName").property'
- 通过线程名称确认线程是否存在 - thread
thread | grep -v 'thread-name'
对于大部分命令和具体用法,都可以使用-h参数查询使用说明。