手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理
一般情况下,我们本地将会有源代码,上面的步骤我们可以进一步省略,我们可以先在自己 IDE 上改动代码,编译生成 class 文件。这样我们只需要运行 redefine
命令即可。也就是说实际上起到作用只是 redefine
。
三、 Instrumentation 与 attach 机制
另外很多应用监控工具,如:zipkin、pinpoint、skywalking。
这种方式只能在应用启动之前生效,存在一定的局限性。
JDK6 针对这种情况作出了改进,增加 agent-main
方式。我们可以在应用启动之后,再运行 Instrumentation
程序。启动之后,只有连接上相应的应用,我们才能做出相应改动,这里我们就需要使用 Java 提供 attach API。
3.2 Attach API
HelloService
输出效果如下所示:
源代码地址:https://github.com/9526xu/hotswap-example
4.3、调试技巧#
普通的应用我们可以在 IDE 直接使用 Debug 模式调试程序,但是上面的程序无法直接使用 Debug。刚开始运行的程序碰到很多问题,无奈之下,只能选择最原始的办法,打印错误日志。后来查看 arthas 的文档,发现上面一篇文章介绍使用 IDEA Remote Debug 模式调试程序。
首先我们需要在 HelloService
JVM 参数加入以下参数:
-Xrunjdwp:transport=dt_socket,server=y,address=8001
此时程序将会被阻塞,直到远程调试程序连接上 8001 端口,输出如下:
然后在 Agent-main
这个工程增加一个 remote 调试。
图中参数如下:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8001
在 Agent-main
工程打上断点,运行远程调试, HelloService
程序将会被启动。
最后在命令行窗口运行 Agent-main
程序,远程调试将会暂停到相应断点处,接下来调试就跟普通 Debug 模式一样,不再叙述。
4.4、相关问题
解决办法为在 pom 下加入 tools.jar 。
<dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId>