前言
如何下载、安装、启动 Arthas 可点击此处Arthas在Docker容器中的使用-环境搭建 或 Arthas 官网
1.sc 查看JVM已加载的类信息
sc class-pattern类名表达式匹配,支持全限定名,也支持斜杆方式 方便我们从异常堆栈中把类名拷贝过来,直接使用sc class-pattern -d查询当前类的详细信息sc class-pattern -f查询当前类的成员变量信息(需要配合参数-d一起使用)
2.sm 查看已加载类的方法信息,只能看到由当前类所声明的方法,父类则无法看到
-
sm class-pattern查看类下的所有方法 -
sm class-pattern method-pattern -d查看指定方法的详细信息
3.mc 将.java文件编译成.class字节码文件
mc 待编译文件路径 -d 文件存放路径指定编译后的文件存放位置
4.redefine 加载外部.class文件,重新定义到JVM中。(在处理bug,需要添加日志打印或者逻辑代码时,可使用。)
注意:
-
1.redefine后的原来的类不能恢复,redefine有可能失败
-
2.
reset命令对redefine的类无效,如果想重置,需要redefine原始的字节码 -
3.
redefine命令和jad/watch/trace/monitor/tt等命令会冲突,执行完 redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置 -
4.不允许新增加field(属性)/method(方法)
-
5.正在跑的函数,没有退出不能生效,如果函数里面调用了其它函数,在其它函数中的修改可以生效 使用示例:
-
jad com.easysan.study.arthas.controller.ArthasController --source-only > /usr/local/arthas/ArthasController.java反编译字节码文件并保存在指定目录下 -
vim ArthasController.java编辑文件,修改返回值从HelloWorld改为HelloWorld-redefine -
sc com.easysan.study.arthas.controller.ArthasController -df获取类加载器hash值 -
mc -c 67e051ff /usr/local/arthas/ArthasController.java -d /usr/local/将.java文件编译为.class文件 -
redefine -c 67e051ff /usr/local/com/easysan/study/arthas/controller/ArthasController.class重新加载.class文件到内存中 -