前言
如何下载、安装、启动 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
文件到内存中