arthas 常用命令
创始人
2025-05-29 05:42:24
0

* dashboard:当前系统的实时数据面板

* thread:查看当前线程信息,查看线程的堆栈

thread 1 | grep 'main(' // thread 1会打印线程 ID 1 的栈,通常是 main 函数的线程

* jad:反编译指定已加载类的源码

jad 类名 // 反编译 Main Class

* trace:方法内部调用路径,并输出方法路径上的每个节点上耗时

trace 类名 方法名 '#cost > 10' -n 1  // 只会展示耗时大于 10ms 的调用路径

* watch:函数执行数据观测

// 观察事件点
// -b 函数调用前
// -e 函数异常后
// -s 函数返回后
// -f 函数结束后
// -x 指定输出结果的属性遍历深度,默认为 1,最大值是 4
// -n 1 指定输出次数// 查看方法参数、目标对象、返回值
watch 类名 方法名 "{params,target,returnObj}"// 查看方法第一个参数,假设 params[0] 是一个List对象
watch 类名 方法名 params[0] -n 1
// 查看数组中的元素
watch 类名 方法名 params[0][0] -n 1
// 查看Pojo的属性
watch 类名 方法名 params[0][0].age -n 1// 集合投影,相当于 java stream 中的 map 方法
watch 类名 方法名 params[0].{name} -n 1// 集合过滤,{? #this.age > 5} 相当于 java stream 中的 filter 方法
watch 类名 方法名 "params[0].{? #this.age > 5}.{name}" -n 1 // 所有age大于5的Pojo的name
watch 类名 方法名 "params[0].{^ #this.age > 5}.{name}" -n 1 // 第一个age大于5的Pojo的name
watch 类名 方法名 "params[0].{$ #this.age > 5}.{name}" -n 1 // 最后一个age大于5的Pojo的name// 多行表达式,把所有Pojo的name拿出来,再往里面新加一个新的元素,在返回新的列表
watch 类名 方法名 '(#test=params[0].{name}, #test.add("abc"), #test)' -n 1
// 调用构造函数,创建一个新的list,然后添加一个新的元素,然后返回添加后的list
watch 类名 方法名 '(#test=new java.util.ArrayList(), #test.add("abc"), #test)' -n 1// 访问静态变量
watch 类名 方法名 '@类名@静态变量名' -n 1
// 调用静态方法
watch 类名 方法名 '@类名@方法名(args)' -n 1
// 静态方法和非静态方法结合
watch 类名 方法名 '@类名@静态方法名().非静态方法名()' -n 1// 访问Map中的元素
watch 类名 方法名 '@类名@静态变量名.keys' -n 1 // 获取这个Map的所有key 
// key 为 enum 类型的获取方法
// 方式一:valueOf
watch 类名 方法名 '@类名@静态变量名.get(@枚举类名@valueOf("RUN"))' -n 1
// 方式二:迭代器+过滤
watch 类名 方法名 '@类名@静态变量名.entrySet().iterator.{? #this.key.name() == "RUN"}' -n 1

* jad + mc + redefine:一条龙实现线上热更新

  1. 反编译需要修改的文件

    jad --source-only 类名 > 目标路径/类名.java
    
  2. sc查找加载修改类的ClassLoader

    sc -d *类名 | grep classLoaderHash
    
  3. mc内存编译代码

    mc -c 1be6f5c3 类名.java -d 目标路径
    
  4. redefine热更新代码

    redefine 类名.class
    

* ognl 获取 Bean 并执行方法

ognl -x 3 '#springContext=@com.ithuameng.admin.utils.SpringUtils@applicationContext,#springContext.getBean("userServiceImpl").getUserByUsername("ithuameng")' -c 18b4aac2

* watch + ognl 返回多个 Bean 方法执行结果

watch -x 2 -n 1 com.ithuameng.admin.service.impl.UserServiceImpl listUser '#springContext=@com.ithuameng.admin.utils.SpringUtils@applicationContext,#user=#springContext.getBean("userServiceImpl"),#redis=#springContext.getBean("redisTemplate"),{#redis.opsForValue().get("pwy::token::1"),#user.getUserByUsername("ithuameng")}'

相关内容

热门资讯

西兰路街道滨河西路社区:楼上漏... 阳光讯(记者 赵小康 通讯员 虢娜维 文/图)“三个多月的烦心事,多亏社区调解员跑断了腿、磨破了嘴,...
湛江一村民小组不服土地权属裁决... 近日,南都记者接到报料,因一块土地的权属问题,湛江吴川市王村港镇覃寮村委会雍快美村民小组、雍快头村民...
《住房租赁条例》公布 促进行业... 今日消息,《住房租赁条例》(以下简称《条例》)已于近日正式公布,并自2025年9月15日起施行。《条...
青岛住房“以旧换新”政策升级   近日,青岛市发布新政“12条”,以更大力度支持住房“以旧换新”,构建“政府引导+政策支持+市场运...
银河电子股价微涨0.98% 子... 截至2025年7月21日收盘,银河电子股价报5.17元,较前一交易日上涨0.98%,成交额1.42亿...
原创 出... 天津一位女高管在商务宴请中被自家老板性侵,不仅身心受创,还因此丢了工作。但最近法院的一纸判决,给了所...
金逸影视股价微涨0.44% 子... 截至2025年7月21日15时,金逸影视股价报9.22元,较前一交易日上涨0.04元。当日成交量为5...
内蒙古自治区工商联、检察院举办... 人民网呼和浩特7月21日电 (记者 苗阳)7月21日,内蒙古自治区工商联、检察院联合内蒙古自治区政法...