资讯动态

Arthas stop 命令详解:优雅关闭诊断服务、断开全部客户端并重置增强类

发布时间:2026/9/19 23:48:51 来源:尧图企业网站定制
Arthas stop 命令详解优雅关闭诊断服务、断开全部客户端并重置增强类【免费下载链接】arthasAlibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas项目地址: https://gitcode.com/gh_mirrors/ar/arthasArthas 是一款 Alibaba 开源的 Java 在线诊断工具允许开发者在生产环境不重启应用的情况下实时排查问题。stop命令是 Arthas 中最具全局影响力的关闭指令它用于终止整个 Arthas 服务端所有连接到该服务端的 Arthas 客户端会全部退出。本文以 site/docs/en/doc/stop.md 为主体结合仓库中的命令实现与引导类源码深入讲解stop命令的功能、底层执行流程及其与reset、redefine/retransform的关系帮助你安全、正确地关闭 Arthas 诊断会话。stop 命令的功能概述根据官方文档stop命令的核心作用是terminates the Arthas server, all the Arthas clients connecting to this server will be disconnected.终止 Arthas 服务端所有连接到该服务端的 Arthas 客户端都将断开连接。也就是说stop并不是简单地退出当前终端会话而是对整个 Arthas 服务端执行关停操作。服务端关闭后通过 telnet、WebSocketWeb Console等渠道连接上来的所有 Arthas 客户端会话都会被一并销毁。同时官方文档中文版见 site/docs/doc/stop.md特别强调了一条关键提示关闭 Arthas 服务器之前会重置掉所有做过的增强类。但是用 redefine 和 retransform 重加载的类内容不会被重置。这条提示道出了stop与普通退出命令的本质区别关闭服务端之前会自动执行一次全局类增强重置但通过redefine/retransform直接重定义字节码的类内容则保留不变。stop 命令的适用场景Arthas 的所有诊断命令如watch、trace、stack、monitor等本质上都是通过字节码注入byte-code-injection在目标类中织入切面逻辑来实现监控与统计的。在官方命令总览文档 site/docs/en/doc/commands.md 中明确指出commands here are taking advantage of byte-code-injection... remember to remove the injected code bystoporreset. 这些命令利用了字节码注入技术……记得使用stop或reset移除注入的代码。因此stop的典型适用场景包括排查完成后的收尾在线诊断任务结束需要一次性清除所有增强效果、断开所有客户端并将目标应用恢复到未诊断状态关闭 Arthas 服务端进程不再需要 Arthas 监听端口与后台服务彻底关停服务端批量会话管理存在多个客户端连接时通过一条stop命令统一断开所有会话而不必逐一执行退出操作。如何在 Arthas 中使用 stop在 Arthas 交互式控制台中直接输入stop并回车即可无需任何参数$ stop Resetting all enhanced classes ... Affect(class count: 12 , method count: 20) cost in 42 ms, listenerId: 0 Arthas Server is going to shutdown...命令执行后当前控制台会退出其余所有连接到该服务端的客户端也会同时断开。从源码看stop命令被定义为无参命令声明如下见 StopCommand.javaName(stop) Summary(Stop/Shutdown Arthas server and exit the console.) public class StopCommand extends AnnotatedCommand {Summary注释明确了两层语义关闭/停止 Arthas 服务端Stop/Shutdown Arthas server以及退出控制台exit the console。stop 的底层执行流程源码级解析stop命令的处理逻辑集中在StopCommand.shutdown(CommandProcess process)方法中见 StopCommand.java其执行流程分为重置增强类 → 发送关停消息 → 销毁服务端三个步骤第一步重置所有增强类resetprocess.appendResult(new MessageModel(Resetting all enhanced classes ...)); EnhancerAffect enhancerAffect arthasBootstrap.reset(); process.appendResult(new ResetModel(enhancerAffect));在执行关停动作之前命令首先向客户端输出Resetting all enhanced classes ...提示随后调用ArthasBootstrap.reset()执行全局增强重置并把重置结果以ResetModel的形式回显包含受影响的类数量、方法数量与耗时统计。这解释了我们在控制台看到的Affect(class count: ... , method count: ...)输出。reset()的底层实现位于 ArthasBootstrap.javapublic EnhancerAffect reset() throws UnmodifiableClassException { return Enhancer.reset(this.instrumentation, new WildcardMatcher(*)); }它借助java.lang.instrument的instrumentation机制以通配符*匹配目标应用中所有被增强的类并逐一还原字节码。这正是文档所强调的关闭服务器之前会重置掉所有做过的增强类的源码依据——stop内部复用了与reset命令相同的增强还原逻辑。第二步发送关停消息并结束当前进程process.appendResult(new ShutdownModel(true, Arthas Server is going to shutdown...));重置完成后命令构造ShutdownModel向客户端广播Arthas Server is going to shutdown...消息然后调用process.end()结束当前命令处理流程。ShutdownModel会通知所有会话准备退出这也是所有客户端同时断开的通信基础。第三步销毁服务端destroy} finally { process.end(); arthasBootstrap.destroy(); }无论上述步骤是否成功finally块都会调用ArthasBootstrap.destroy()对服务端做最终清理。从 ArthasBootstrap.java 的destroy()实现可以看到它负责依次释放 Arthas 的各类资源关闭 MCP 服务arthasMcpBootstrap.shutdown()避免停止后残留调度线程导致ArthasClassLoader无法回收关闭 shell 服务端shellServer.close()与会话管理器sessionManager.close()停止 HTTP 会话管理器httpSessionManager.stop()、取消定时器timer.cancel()停止 Tunnel 客户端tunnelClient.stop()关闭并销毁线程池executorService.shutdownNow()与增强转换器transformerManager.destroy()移除类加载器相关的字节码转换器classLoaderInstrumentTransformer清理Spy类中的引用cleanUpSpyReference()、关闭 Netty 工作线程组、销毁用户统计UserStatUtil.destroy()移除 JVM 关闭钩子shutdown hook并在跨 mount namespace 场景下清理临时 Arthas home 目录。从源码结构看stop并不是简单的断开连接而是一整套完整的服务端生命周期收尾流程目标是让注入的增强全部还原、占用的资源全部释放使目标 JVM 恢复到接近未安装 Arthas 的状态。stop 与 reset、redefine / retransform 的关系理解stop的关键在于区分它与其他命令在类状态处理上的差异命令对已增强类的处理对重新加载类内容的处理对服务端的影响stop自动重置所有增强类与reset等价redefine / retransform 重新加载的类内容不会被重置终止整个服务端断开所有客户端reset重置所有增强类同上不关闭服务端会话继续可用redefine/retransform直接重定义/重转换目标类字节码属于永久性类内容变更不涉及服务端生命周期这里需要特别强调官方文档的 tip使用redefine或retransform命令重加载的类内容不会被stop重置。其原因可以从实现层面理解reset只负责还原通过字节码注入enhancement方式产生的增强而redefine/retransform是对类字节码本身的直接重定义其效果不归属于增强范畴因此不会在关停时被自动还原。如果你的线上排查过程中用到了这两个命令且希望在关闭 Arthas 后彻底恢复原类字节码需要在关停之前自行评估并手动恢复。使用 stop 的注意事项stop是服务端级操作它会关闭 Arthas 服务端并断开所有客户端会话不只是当前终端。请确认没有其他正在使用的会话再执行该命令。增强类会被自动重置正常通过watch、trace等命令注入的增强会在关停前被自动清除一般无需担心增强残留这也是官方建议在排查结束后使用stop或reset清理注入代码的原因。redefine / retransform 的结果不会被重置这两类命令造成的类内容变更在stop后依然保留若需还原需提前处理。执行后服务端不可再用stop之后 Arthas 服务端进程被销毁需要重新诊断时必须重新启动 Arthas参考 start-arthas.md再建立新的客户端连接。延伸阅读stop 命令英文文档 与 stop 命令中文文档本文的直接依据reset 命令文档了解手动重置增强类的用法redefine 命令文档 与 retransform 命令文档理解这两类不受重置影响的命令命令总览了解全部 Arthas 命令及其与字节码注入的关系StopCommand.javastop命令的入口实现ArthasBootstrap.javareset()与destroy()的完整服务端清理逻辑。【免费下载链接】arthasAlibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas项目地址: https://gitcode.com/gh_mirrors/ar/arthas创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价