[alibaba/arthas]【使用疑问】有关于通过 arthas-boot 启动arthas的一些疑问

2022-11-08 803 views
9
  1. 通过阅读arthas的相关代码,我了解到,当执行 java -jar arthas-boot.jar 时,内部通过 Process 执行了命令 java -jar arthas-core
  2. arthas-core 在启动时会 attach到目标进程, 并执行 loadAgent(arthas-agent)
  3. arthas-agent 中的 agentmain方法会初始化 ArthasBootstrap 。 在初始化ArthasBootstrap时候,提供了一个 shutdown勾子,勾子会执行 ArthasBootstrap#destroy 方法

我的疑问是:当我们kill arthas-boot.jar 进程时,会触发 ArthasBootstrap#destroy 吗? 如果不会触发 shutdown勾子,那已经增强过的字节码,在arthas-boot.jar进程停止的时候,是如何做到自动reset呢? ArthasBootstrap实例是在 premain 初始化的,是否可以理解成这是在目标进程中初始化的实例,也就是只有在目标进程关闭时才会触发对应的勾子呢?这个地方比较迷惑

回答

5

arthas-boot 只是一个辅助进程,它影响不到应用进程。它和作用和 as.sh类似。

  • arthas-boot.jar进程停止的时候,不会做到自动reset
  • kill arthas-boot.jar 进程时,不会触发 ArthasBootstrap#destroy
  • 用户显式执行stop命令,会主动ArthasBootstrap#destroy,用户的jvm退出时,因为shutdown hook,也会执行ArthasBootstrap#destroy
2

@hengyunabc 多谢 原来是这样子吗? 那也就是说,在我们使用了arthas各种指令后,都必须去手动 stop 或reset 。额,那自己之前的用法一直都是有问题的,都是直接把 arthas-boot 关了就不管了

9

需要手动stop,不执行的话,通常影响也不大。

9

@hengyunabc 不stop的话,那增强的字节码就一直还在,这样不会有影响吗