Arthas的classloader相关命令
sc
作用,查看 JVM 已加载的类信息,“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开 options disable-sub-class true 开关。
参数说明:


sc demo.MathGame
sc demo.*
sc demo.* -d

sc demo.* -df
sm
作用,查看已加载类的方法信息,“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。sm 命令只能看到由当前类所声明 (declaring) 的方法,父类则无法看到。
参数说明:


sm demo.*

sm demo.* -d
jad
作用,反编译指定已加载类的源码,jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,在 Arthas Console 上,反编译出来的源码是带语法高亮的,阅读更方便,反编译出来的 java 代码可能会存在语法错误,但不影响你进行阅读理解。
直接反编译一个类:
jad java.lang.String

jad demo.MathGame

反编译时只显示源代码:
jad --source-only demo.MathGame

反编译指定的函数:
jad demo.MathGame main

mc
Memory Compiler / 内存编译器,编译 .java 文件生成 .class,可自行上传一个 .java 文件上去进行测试:
mc /usr/local/arthas/Test.java -d /usr/local/arthas/


refine
作用,加载外部的 .class 文件,redefine jvm 已加载的类,注意事项,redefine 的 class 不能修改、添加、删除类的 field 和 method,包括方法参数、方法名称及返回值,如果 mc 失败,可以在本地开发环境编译好 class 文件,上传到目标系统,使用 redefine 热加载 class,目前 redefine 和 watch / trace / jad / tt 等命令冲突,以后重新实现 redefine 功能会解决此问题。限制,不允许增加 field / method,正在运行的函数,没有退出不能生效。
把反编译之后的代码存到指定文件当中,将 class 文件编译成 java 源文件:
jad --source-only demo.MathGame > /usr/local/arthas/MathGame.java
打开指定文件,在里面新加入一些代码,编辑文件可以利用 vim 也可以用你个人平时喜欢的编辑方式修改也可以:

System.out.println("while-run");
System.out.println("new Code");
使用 mc 命令对字节码重新编译,将 java 文件编译成 class 文件:
mc /usr/local/arthas/MathGame.java -d /usr/local/arthas

使用 redefne:
redefine /usr/local/arthas/demo/MathGame.class

dump
作用,dump 已加载类的 bytecode 到特定目录:
dump demo.*

dump demo.* -d /usr/local/arthas

classloader
显示所有类加载器信息:
classloader -l

获取某个类加载器所在的 jar 包:
classloader -c hash

获取某个资源所在的 jar 包:
classloader -c hash -r META-INF/MANIFEST.MF

加载某个类到内存当中:
classloader -c hash -load java.lang.String



浙公网安备 33010602011771号