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+
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 50. Vue名称案例-使用keyup事件监听
- 浅谈树形结构的特性和应用(上):多叉树,红黑树,堆,Trie树,B树,B+树...
- 腾讯云-轻量应用服务器SaaS交付Discuz! Q
- LeetCode 刷题技巧与学习方法
- IntelliJ IDEA 2020.2正式发布,诸多亮点总有几款能助你提效
- SQL之单表查询
- Ubuntu19.10 编译运行C语言程序
- Linux 中杀死指定端口的进程
- Python:将给定字符串中的大写英文字母按以下对应规则替换
- 数据库原理02——关系数据库
- 计算机网络02——物理层
- 面试官你好,我已经掌握了MySQL主从配置和读写分离,你看我还有机会吗?
- 虚拟机中安装双系统
- 一张图记住 Vim 常用命令
- 数据库原理01——概述