Java诊断应用之Arthas实战(技术创作101训练营)

时间:2022-07-25
本文章向大家介绍Java诊断应用之Arthas实战(技术创作101训练营),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

使用Arthas获取Spring Context:

1.执行tt命令来记录RequestMappingHandlerAdapter#invokeHandlerMethod的请求

tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod

执行后,刷新下SpringBoot应用的url,这里刷新的是 http://192.168.1.40:2022/

刷新一下,arthas就会记录一条请求日志

可以获得这条记录的index是1000

2.获取Spring Context:

根据 index为1000,继续下面的工作

用tt命令的-i参数来指定index,并且用-w参数来执行ognl表达式来获取spring context

tt -i 1000 -w 'target.getApplicationContext()'

输出一大串结果,这里看到beanFactory其实就已经知道了,我们已经获取了所有的bean

3.测试 调用goodsRealServiceImpl服务类中的getByRealGoodsId()方法获取返回值

由此可见,使用Arthas获取到SpringContext真的方便很多。

除此之外,我们还可以使用Arthas进行代码热更新:

访问本地启动的一个服务,结果如下,下面通过热更新,在启动成功 汉字后面增加Arthas相关文字:

进入到相应的java进程,这里进入选择3


1. 使用jad命令来反编译目标代码

jad --source-only com.upupor.app.controller.IndexController > /tmp/IndexController.java

2. 重新打开一个窗口,编辑目标代码 vim /tmp/IndexController.java

package com.upupor.app.controller;

import com.upupor.framework.CcConstant;
import com.upupor.framework.CcResponse;
import com.upupor.framework.utils.SpringContextUtils;
import com.upupor.service.BannerService;
import io.swagger.annotations.Api;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {
    @GetMapping(value={"/"})
    public CcResponse index() {
        String version = SpringContextUtils.getProperty("application.version");
        CcResponse ccResponse = new CcResponse();
        ccResponse.setData(version);
        // 修改的地方!!在 启动成功 后面添加 Arthas
        ccResponse.setMessage("upupor启动成功Arthas");
        return ccResponse;
    }
}

3.根据IndexController找出ClassLoader

可以获得classLoader 是  764c12b6

4.使用mc,在内存中编绎代码

使用mc(Memory Compiler)命令来编译,并且通过-c参数指定ClassLoader

mc -c 764c12b6 /tmp/IndexController.java -d /tmp

输出结果

5.redefine热更新代码

/tmp/com/kuaiban/app/controller/IndexController.class 是 上一步 mc 输出的结果

6.验证结果:

更多使用案例可以访问:

https://github.com/alibaba/arthas/issues?q=label%3Auser-case+