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")}'

相关内容

热门资讯

原创 中... 联合国的最新表态令人精神一振,这种明确态度其实本就顺理成章。台湾自古属于中国,这是铁一般的事实,中国...
花800元就能买自己的死亡证明... 花800元就能买到 本人的精神诊断报告和死亡证明? 近日,“假证定制”业务 在多个电商和社交平台 死...
智能平台支撑政策落地 实达集团... 11月17日,福建省发展和改革委员会网站发布《福建省数据管理局关于印发〈福建省数据流通交易管理办法(...
祥明智能:制定对外投资管理制度 祥明智能公告称,为规范公司及控股子公司对外投资、资产处置的程序及审批权限,建立有效控制机制保障资金运...
美国9月非农数据受政府关门扰动... 11月21日,中国银河证券发布研报对美国9月非农数据进行点评。研报指出,9月新增就业回到增长区间,失...
原创 高... 近日,随着日本政坛极端言论频频出现,尤其是汉奸石平的发声,再次引发了人们对中日关系未来走势的广泛关注...
日媒曝光:日本曾制定3套“夺岛... 据央视新闻报道,随着日本首相高市早苗涉台挑衅言论持续发酵,日本自卫队在靠近台海的岛屿加强军力部署的情...
舞蹈家黄豆豆获破格提拔,已任副... 今年4月拟破格提拔的舞蹈家黄豆豆,已有新消息。 澎湃新闻注意到,中国舞蹈家协会官网近日更新后显示,黄...
李霄鹏告别青岛海牛:战术调整与... 随着2023赛季的落幕,李霄鹏教练组已正式与青岛海牛球员告别,确认下赛季将不再继续执教。这一决定不仅...