文章来源:image.png

一般情况下,我们本地将会有源代码,上面的步骤我们可以进一步省略,我们可以先在自己 IDE 上改动代码,编译生成 class 文件。这样我们只需要运行 redefine 命令即可。也就是说实际上起到作用只是 redefine 。

三、 Instrumentation 与 attach 机制image.png

另外很多应用监控工具,如:zipkin、pinpoint、skywalking。

这种方式只能在应用启动之前生效,存在一定的局限性。

JDK6 针对这种情况作出了改进,增加 agent-main 方式。我们可以在应用启动之后,再运行 Instrumentation 程序。启动之后,只有连接上相应的应用,我们才能做出相应改动,这里我们就需要使用 Java 提供 attach API。

3.2 Attach APIimage.png

HelloService 输出效果如下所示:

image.png

源代码地址:https://github.com/9526xu/hotswap-example

4.3、调试技巧#

普通的应用我们可以在 IDE 直接使用 Debug 模式调试程序,但是上面的程序无法直接使用 Debug。刚开始运行的程序碰到很多问题,无奈之下,只能选择最原始的办法,打印错误日志。后来查看 arthas 的文档,发现上面一篇文章介绍使用 IDEA Remote Debug 模式调试程序。

首先我们需要在 HelloService JVM 参数加入以下参数:

Copy
-Xrunjdwp:transport=dt_socket,server=y,address=8001

此时程序将会被阻塞,直到远程调试程序连接上 8001 端口,输出如下:

image.png

然后在 Agent-main 这个工程增加一个 remote 调试。

image.png

image.png

图中参数如下:

Copy
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8001

在 Agent-main 工程打上断点,运行远程调试, HelloService 程序将会被启动。

最后在命令行窗口运行 Agent-main 程序,远程调试将会暂停到相应断点处,接下来调试就跟普通 Debug 模式一样,不再叙述。

4.4、相关问题image.png

解决办法为在 pom 下加入 tools.jar 。

Copy
<dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId>