ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Arthas reset 命令完全指南:一键还原所有被增强类

Arthas reset 命令完全指南:一键还原所有被增强类 Arthas reset 命令完全指南一键还原所有被增强类【免费下载链接】arthasAlibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas项目地址: https://gitcode.com/gh_mirrors/ar/arthas本指南系统讲解 Arthas 诊断工具中的reset命令它的核心职责是将被watch、trace、stack、monitor等命令增强字节码改写过的类全部还原为原始字节码让应用运行时行为回归未经插桩的状态。阅读完本文你将掌握reset的完整参数用法、通配符与正则匹配规则并能结合源码理解其基于Instrumentation.retransformClasses的重转换还原原理在排查线上问题时安全、精准地释放 Arthas 对目标类的增强。reset 命令是什么reset是 Arthas 提供的一个基础命令作用一句话即可概括重置增强类将被 Arthas 增强过的类全部还原。使用watch、trace、stack、monitor、tt等命令时Arthas 会在 JVM 层面对目标类进行字节码增强enhance注入诊断相关的拦截逻辑reset则负责把这些注入的逻辑清除使类恢复成未增强前的原始字节码形态。需要特别注意的是Arthas 服务端执行stop时会自动重置所有增强过的类因此reset更多用于不退出 Arthas、只撤销部分增强的场景。相关实现可参考 StopCommand.java其中会先输出Resetting all enhanced classes ...再调用arthasBootstrap.reset()完成全部类的还原。使用参考完整命令格式与参数通过reset -h可以查看该命令的完整使用说明$ reset -h USAGE: reset [-h] [-E] [class-pattern] SUMMARY: Reset all the enhanced classes EXAMPLES: reset reset *List reset -E .*List OPTIONS: -h, --help this help -E, --regex Enable regular expression to match (wildcard matching by default) class-pattern Path and classname of Pattern Matching各参数含义如下表参数说明-h, --help查看命令帮助信息-E, --regex启用正则表达式匹配默认使用通配符匹配class-pattern类名匹配表达式支持全限定类名含包路径通配符匹配与正则匹配默认采用通配符匹配wildcard matching。例如reset *List会匹配所有以List结尾的类名。加上-E后采用正则表达式匹配。例如reset -E .*List与reset *List效果等价但正则能力更强可以写出更精确的匹配模式。当class-pattern为空例如直接执行reset时表示匹配全部类即还原所有增强类。从源码看匹配逻辑位于 SearchUtils.java 的classNameMatcher方法当类名模式为空时通配符模式回退为*、正则模式回退为.*同时会把模式中的/替换为.即包路径分隔符规范化$$Lambda特殊名称除外最终分别构建WildcardMatcher或RegexMatcher完成匹配。还原指定类当只想撤销对某一个或某一类特定类的增强时传入class-pattern即可。以下为官方文档中的完整示例$ trace Test test Press CtrlC to abort. Affect(class-cnt:1 , method-cnt:1) cost in 57 ms. ---ts2017-10-26 17:10:33;thread_namemain;id1;is_daemonfalse;priority5;TCCLsun.misc.Launcher$AppClassLoader14dad5dc ---[0.590102ms] Test:test() ---ts2017-10-26 17:10:34;thread_namemain;id1;is_daemonfalse;priority5;TCCLsun.misc.Launcher$AppClassLoader14dad5dc ---[0.068692ms] Test:test() $ reset Test Affect(class-cnt:1 , method-cnt:0) cost in 11 ms.示例解读先用trace Test test对Test类的test方法开启方法调用路径追踪Arthas 提示Affect(class-cnt:1 , method-cnt:1)表示增强生效。随后执行reset Test输出Affect(class-cnt:1 , method-cnt:0) cost in 11 ms.表示已还原 1 个类。注意此时method-cnt:0是因为还原操作统计的是被还原的类数量增强注入的方法逻辑已随类还原一并清除。还原之后trace注入的拦截逻辑失效再次调用test方法不会再产生追踪输出。还原所有类不带任何参数执行reset即可还原所有被 Arthas 增强过的类$ trace Test test Press CtrlC to abort. Affect(class-cnt:1 , method-cnt:1) cost in 15 ms. ---ts2017-10-26 17:12:06;thread_namemain;id1;is_daemonfalse;priority5;TCCLsun.misc.Launcher$AppClassLoader14dad5dc ---[0.128518ms] Test:test() $ reset Affect(class-cnt:1 , method-cnt:0) cost in 9 ms.该命令执行时Arthas 会遍历所有已加载类中处于增强状态的类逐一执行还原。即使此前对多个类、多个方法执行过多种增强命令一次reset即可全部清除让应用恢复到干净状态。源码实现深度解析reset 是如何工作的命令入口ResetCommandreset命令的定义与处理逻辑位于 ResetCommand.java。该类使用Name(reset)声明命令名Summary(Reset all the enhanced classes)声明命令摘要其核心process方法调用链如下从process.session().getInstrumentation()获取当前 JVM 的Instrumentation实例通过SearchUtils.classNameMatcher(classPattern, isRegEx)构建类名匹配器默认通配符-E时为正则调用Enhancer.reset(inst, matcher)执行真正的还原逻辑将执行结果封装为ResetModel定义于 ResetModel.java其getType()返回reset追加到命令结果中输出。若还原过程中抛出UnmodifiableClassException说明某些类不可被重转换命令会静默忽略该异常并正常结束不影响其他类的还原。还原核心Enhancer.reset真正的还原逻辑在 Enhancer.java 的reset静态方法中其关键实现public static synchronized EnhancerAffect reset(final Instrumentation inst, final Matcher classNameMatcher) throws UnmodifiableClassException { final EnhancerAffect affect new EnhancerAffect(); final SetClass? enhanceClassSet new HashSetClass?(); for (Class? classInCache : classBytesCache.keySet()) { if (classNameMatcher.matching(classInCache.getName())) { enhanceClassSet.add(classInCache); } } try { enhance(inst, enhanceClassSet); logger.info(Success to reset classes: enhanceClassSet); } finally { for (Class? resetClass : enhanceClassSet) { classBytesCache.remove(resetClass); affect.cCnt(1); } } return affect; }其工作原理可以拆解为三步筛选待还原类Arthas 内部维护了一个classBytesCache定义见 Enhancer.java类型为WeakHashMapClass?, Object凡是执行过增强的类都会以键的形式登记在缓存中增强时通过classBytesCache.put(classBeingRedefined, new Object())记录见同文件 L354。reset遍历该缓存用类名匹配器过滤出需要还原的类集合。触发重转换调用enhance(inst, enhanceClassSet)内部对筛选出的类数组执行inst.retransformClasses(classArray)见同文件 L751-L759。retransformClasses是 JVM Instrumentation API 的重转换机制会重新执行已注册的字节码转换器由于增强类已从缓存中移除或转换器对非增强类返回原始字节类得以恢复为原始字节码形态注入的诊断逻辑随之失效。清理缓存并统计在finally块中把已还原的类从classBytesCache移除同时affect.cCnt(1)累加受影响类数量最终返回EnhancerAffect供命令输出Affect(class-cnt:N , method-cnt:M) cost in X ms.形式的统计结果。与 stop 命令的联动当执行stop停止 Arthas 服务端时会先调用全局的reset见 StopCommand.java即停止 Arthas 必然伴随对所有增强类的自动还原。这也解释了为何stop之后应用行为会恢复如初。因此从资源释放角度reset相当于局部 stop 增强它只撤销字节码增强而不会终止 Arthas 服务端进程或断开当前诊断会话。适用场景与注意事项典型使用场景撤销误操作或不再需要的增强当watch/trace等命令的增强已无价值希望降低对目标方法性能的影响时用reset精准撤销。批量清理一次reset不带参数可一次性还原所有增强类适合诊断结束后统一清理。配合-E正则做精确批量还原例如只还原某个包路径下的增强类reset -E com\.example\.service\..*比逐个还原更高效。注意事项增强状态不可恢复reset执行后之前针对这些类设置的watch、trace、monitor等增强状态全部丢失如需继续诊断需要重新执行对应命令。匹配范围还原目标以classBytesCache中已增强的类为全集传入的模式只会命中其中已登记的增强类未增强的类不会出现在结果中这也是示例里Affect(class-cnt:1)只统计已增强类的原因。不可重转换类个别由 JVM 限制不可重转换的类UnmodifiableClassException会被跳过命令仍正常结束不影响其余类。重转换的开销retransformClasses涉及类字节码的重新加载与 JIT 重编译对大型应用批量还原时会有短暂开销建议在低峰期操作。总结reset是 Arthas 中逆向操作的核心命令与watch、trace等正向增强命令形成闭环增强命令改写字节码注入诊断逻辑reset通过retransformClasses配合classBytesCache缓存清理将类还原为原始状态。其支持通配符与正则两种匹配模式既可精准还原指定类也可一键还原全部增强类而服务端stop时的自动重置则保证了 Arthas 退出后应用始终能恢复干净运行环境。【免费下载链接】arthasAlibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas项目地址: https://gitcode.com/gh_mirrors/ar/arthas创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表