什么是Arthas
Arthas 是Alibaba开源的Java诊断工具,相比 JDK 内置的诊断工具,功能强大,可以实现许多问题的一键定位,可以一键反编译类查看源码,甚至可以直接进行生产代码热修复。
安装
直接当工具方式安装
第一步:从官网直接下载 arthas-boot.jar
第二步:通过java -jar arthas-boot.jar 直接运行
通过pom.xml直接集成到项目
第一步:配置pom.xml文件
<dependency> <groupId>com.taobao.arthas</groupId> <artifactId>arthas-spring-boot-starter</artifactId> <version>3.5.0</version> </dependency>
第二步:配置项目配置文件(xxx.yml或者xxx.properties)
yml:
arthas: ip : 0.0.0.0 httpPort : 8564 telnetPort : 3659
properties:
arthas.ip=0.0.0.0 arthas.httpPort=8564 arthas.telnetPort=3659
常用命令
官方文档:https://arthas.aliyun.com/doc/commands.html
命令1
解决问题
热更
原理:通过redefine这个主要加载外部的 .class 文件的命令,来实现替换 JVM 已经加载的类,从而实现 Java 的热更新
不能更新的情况:
- 增加了 field
- 增加了 method
- 替换正在运行的方法
问题描述:当运行过程中UserTimerTask 类发现了问题,需要不停机修改
处理流程:
启动arthas
java -jar arthas-boot.jar
登录arthas,使用jad命令进行反编译,并把反编译java类存到指定的目录下
jad --source-only com.gameserver.server.UserTimerTask > /home/UserTimerTask.java
修改源码
找到类在pid对应的线程的内存中的哈希值 (36328d33 )
sc -d *UserTimerTask | grep classLoaderHash
将修改后的代码内存编译生成class文件,保存到指定目录
mc -c 36328d33 /home/UserTimerTask.java -d /home/
加载修改后的class文件
redefine /home/com/gameserver/server/UserTimerTask.class