阿里开源工具Arthas实践

什么是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 的热更新

不能更新的情况:

  1. 增加了 field
  2. 增加了 method
  3. 替换正在运行的方法

问题描述:当运行过程中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

You May Also Like

About the Author: 一块自由的砖

码农一个,一块自由勤恳的砖,哪里需要哪里搬!( ̄▽ ̄)"