[alibaba/arthas]命令(如 watch)退出后(如通过 Ctrl-c)增强的 class 没有被还原

2025-11-10 792 views
3
环境信息 arthas-boot.jar 或者 as.sh 的版本: master Arthas 版本: master 操作系统版本: MacOS 11.4 目标进程的JVM版本: JDK 11 执行arthas-boot的版本: JDK 11 重现问题的步骤 通过 https://github.com/alibaba/arthas/issues/222 中描述的方法开启 arthas debug 在 SpyAPI.atExit 中打断点 在 arthas 中执行 watch 命令增强类,此时断点被触发,说明类被增强了 在 arthas 中执行 Ctrl-C 退出 watch 命令,发现断点依旧被触发,说明命令虽然退出了,但增强的类没有被还原。 期望的结果

在命令退出后,增强的类被还原

实际运行的结果

增强类没有被还原

额外说明 问题的背景是尝试为 watch 命令增加 @AtLine 的支持,但因为 AtLine 增加的字节码较多,在考虑退出后将增强类还原。相关 PR:https://github.com/alibaba/arthas/pull/2076 看到 arthas 里有 reset 命令可以还原所有增强的类。不确定“命令退出后不还原”是不是一个 feature。

回答

9

因为在排查问题过程中,watch/trace之类的通常会多次执行。因此,会保留插入的 SpyAPI 代码。 不然,jvm要反复JIT,应用性能会反复波动。

0

明白,谢谢解答