使用arthas对一段垃圾代码热更新去除。
缘由
mysql备库一阵没看,同步严重落后,然后发现了sql语句,删除语句,所谓为了 减轻负载 ,在多个超5G的库上,while (true)的,对一个没有索引的列进行查询 并对另一个没有索引的列进行orderby 然后在limit 200.
看到时,真是一口老槽不知道往哪里吐。
处理数据库的事不谈,另一个,线上的代码,不愿晚上做替换。考虑做热更新。
工具
用的Arthas
还算好用
地址: https://alibaba.github.io/arthas/index.html
注意
热更新不推荐,不推荐,不推荐!
我是懒。。而且应用不重要,随时可以恢复
经过
- 先反编译看看
jad com.comment.platform.service.CommentDeleteJob
这里可以注意一下classloader
这个是springboot,取ClassLoader: +-org.springframework.boot.loader.LaunchedURLClassLoader@439f5b3d +-sun.misc.Launcher$AppClassLoader@55f96302 +-sun.misc.Launcher$ExtClassLoader@26a1ab54
.LaunchedURLClassLoader@439f5b3d
的 439f5b3d - 没问题,反编译到临时文件
jad --source-only com.comment.platform.service.CommentDeleteJob > /tmp/CommentDeleteJob.java
- 使用vim修改临时文件。我直接把相应的代码处,做了return
- 重新编译。
mc -c 439f5b3d /tmp/CommentDeleteJob.java -d /tmp
注意这里使用-c参数指定ClassLoader - 加载
redefine /tmp/com/comment/platform/service/CommentDeleteJob.class
后记
慎用 慎用 慎用 出了问题不管。