记录使用Arthas修改线上源码重新加载的一次过程
<h1 id="前情提要">前情提要</h1><pre><code>线上跑的代码找不到源码了,项目又需要调整某个字段的校验规则,早有耳闻知道可以通过Arthas完成这个场景的需求,实际动手试了试,在此记录一下。
</code></pre>
<h1 id="警告警告">警告!警告!</h1>
<pre><code class="language-shell"># !!! 重要警告 !!!
# 1. 生产环境谨慎使用,先测试
# 2. 修改前备份原始类
# 3. 确保修改符合JVM规范
# 4. 注意内存泄漏风险
# 5. 重启后会丢失修改
# 安全操作流程:
# 1. jad导出源码备份
# 2. 在小范围测试修改
# 3. mc编译时检查错误
# 4. redefine后立即验证
# 5. 记录修改内容以便后续正式发布
</code></pre>
<h1 id="基本流程">基本流程</h1>
<pre><code class="language-shell">1. 反编译现有类 -> 2. 修改代码 -> 3. 编译成.class -> 4. 重新加载
</code></pre>
<h1 id="启动arthas">启动Arthas</h1>
<pre><code>进入到Arthas的bin目录下执行 `./as.sh` 命令,选择对应的Java服务。
</code></pre>
<h1 id="反编译现有类到指定文件">反编译现有类到指定文件</h1>
<pre><code class="language-shell">jad --source-only *** > /***/arthas-output/***.java
</code></pre>
<h1 id="修改代码">修改代码</h1>
<pre><code class="language-shell">vi /***/arthas-output/***.java
</code></pre>
<h1 id="编译成class文件">编译成.class文件</h1>
<pre><code class="language-shell">mc -c <ClassLoaderHash> /***/arthas-output/***.java -d /***
</code></pre>
<h2 id="查看classloaderhash的值">查看ClassLoaderHash的值</h2>
<pre><code class="language-shell">sc -d com.***
</code></pre>
<p>输出的内容会显示具体的ClassLoaderHash值</p>
<h1 id="重新加载class文件">重新加载class文件</h1>
<pre><code class="language-shell">retransform /***/***.class
</code></pre><br><br>
来源:https://www.cnblogs.com/caInlao/p/19595068
頁:
[1]