使用arthas对一段垃圾代码热更新去除。

缘由

mysql备库一阵没看,同步严重落后,然后发现了sql语句,删除语句,所谓为了 减轻负载 ,在多个超5G的库上,while (true)的,对一个没有索引的列进行查询 并对另一个没有索引的列进行orderby 然后在limit 200.

看到时,真是一口老槽不知道往哪里吐。
处理数据库的事不谈,另一个,线上的代码,不愿晚上做替换。考虑做热更新。

工具

用的Arthas
还算好用
地址: https://alibaba.github.io/arthas/index.html

注意

热更新不推荐,不推荐,不推荐!
我是懒。。而且应用不重要,随时可以恢复

经过

  • 先反编译看看
    jad com.comment.platform.service.CommentDeleteJob
    这里可以注意一下classloader
    ClassLoader:
    +-org.springframework.boot.loader.LaunchedURLClassLoader@439f5b3d
      +-sun.misc.Launcher$AppClassLoader@55f96302
        +-sun.misc.Launcher$ExtClassLoader@26a1ab54
    
    这个是springboot,取.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

后记

慎用 慎用 慎用 出了问题不管。