arthas 热布置的运用场景主要有以下几个:

  1. 调试时快速修正代码:在不需要重启运用的状况下,能够快速修正代码,进行调试。

  2. 补丁修正:当线上呈现紧急 bug 时,能够通过热布置办法及时修正问题,避免影响线上的正常业务。

  3. 功能优化:通过热布置能够动态修正代码,便利进行功能优化和相关问题的调试。

  4. 动态调整运用装备:通过修正运用装备参数等信息,能够调整运用的行为,进一步优化运用的功能和响应速度。

  5. 监控运用状况:能够通过 arthas 热布置实时监控运用状况和各种指标,快速定位问题并进行优化。

总的来说,arthas 热布置能够进步开发和调试的功率,快速定位和处理线上问题,以及优化运用的功能。

下面是代码实践:

运用SpringBoot启动一个Http接口。

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}

jad 反编译能够看到:

arthas@96830]$ jad com.example.demo.controller.HelloController
ClassLoader:
+-jdk.internal.loader.ClassLoaders$AppClassLoader@9e89d68
  +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@5a8e68a3
Location:
/Users/xxxx/IdeaProjects/AdvancedJava/demo/target/classes/
       /*
        * Decompiled with CFR.
        */
       package com.example.demo.controller;
       import org.springframework.web.bind.annotation.GetMapping;
       import org.springframework.web.bind.annotation.RestController;
       @RestController
       public class HelloController {
           @GetMapping(value={"/hello"})
           public String hello() {
/*15*/         return "Hello World!";
           }
       }
Affect(row-cnt:1) cost in 247 ms.

现在我们针对这个类的源代码进行修正。

源代码获取也能够通过命令行:

jad --source-only com.example.demo.controller.HelloController > /opt/HelloController.java

面试官:怎样使用arthas进行热部署,解决线上问题?

通过idea的Build工具进行Recompile重编译源码

面试官:怎样使用arthas进行热部署,解决线上问题?

或许运用mc进行编译

mc /Users/xxx/Downlxoads/HelloController.java -d /Users/xxx/Downloads/

idea提示是否要重启SpringBoot,这个时候直接点Cancel,撤销。假如重启了就会导致新的代码被加载到新进程啦。

面试官:怎样使用arthas进行热部署,解决线上问题?

这时候我们能够再运用jad来看这个类的状况,会发现还是原来的代码,Hello World!

然后开始运用retransform来热布置新的class文件。

class文件途径:

/Users/xxxx/IdeaProjects/AdvancedJava/demo/target/classes/com/example/demo/controller/HelloController.class

面试官:怎样使用arthas进行热部署,解决线上问题?

执行命令:

加载外部的.class文件,retransform jvm 已加载的类。

retransform/Users/xxxxx/IdeaProjects/AdvancedJava/demo/target/classes/com/example/demo/controller/HelloController.class

面试官:怎样使用arthas进行热部署,解决线上问题?

运用vmtool获取目标,再用目标调用办法

[arthas@47968]$ vmtool --action getInstances --className com.example.demo.controller.HelloController --express 'instances[0].hello()'
@String[Hello Ketty!]

我们能够看到,对应的代码被我们重新加载啦。

面试官:怎样使用arthas进行热部署,解决线上问题?

欢迎重视大众号:程序员的思考与落地

大众号供给很多实践事例,Java入门者不容错过哦,能够沟通!!