window下Java诊断工具arthas 实操心得

本文介绍了如何使用jad命令反编译Java类以获取源代码,然后通过mc命令进行内存编译,以及利用redefine命令实现类的动态热修复。在无源码的线上环境中,这一流程对于快速修复问题具有重要意义。然而,当源码文件中存在多个classloader时,mc命令可能无法成功编译,此时需要手动操作。整个过程包括jad反编译、mc编译和redefine重新定义类,适用于方法体的修改。
摘要由CSDN通过智能技术生成

1、使用 jad命令反编译java类得到源代码文件 此时注意路径中斜杠只能使用反斜杠

jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java

2、使用mc内存编译命令编译源文件

mc /tmp/UserController.java -d /tmp

Mc 编译对于tomcat来说仍然可能会失败

Mc –c 类的classloaderhash或classloader全限定名(classloader hash根据sc –d 类名全限定名获取)。如(mc -c 10731e16 F:/git6/arthasroot/QueryFilter.java -d F:/git6/arthasroot)(‘>’ 符号可以将命令输出结果重定向到文件)

存在的问题是当源码文件中存在多个classloader时mc –c只能指定一个classloader,所以会编译不通过。此时只能使用手动编译。

ClassLoader –c (classloader哈希code)可以列出classloader已加载的类。

实操截图如下

 

3、redefine命令重新动态加载类(只能重载方法体)

redefine /tmp/com/example/demo/arthas/user/UserController.class

4、综合上述三个命令实现线上热修复(在无源码的情况下)的一般步骤。Jad反编译出类源码->对源码做出略微修改(比如加入调试日志等等)->使用Mc命令编译经过略微修改的源码为class文件,使用redefine重新定义类。(redefine只对方法体的修改有效)

实操截图如下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天水麒麟姜伯约

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值