Arthas-常用命令(四)

368 阅读2分钟

前言

如何下载、安装、启动 Arthas 可点击此处Arthas在Docker容器中的使用-环境搭建 或 Arthas 官网

1.sc 查看JVM已加载的类信息

  • sc class-pattern 类名表达式匹配,支持全限定名,也支持斜杆方式 方便我们从异常堆栈中把类名拷贝过来,直接使用image.pngimage.png
  • sc class-pattern -d 查询当前类的详细信息image.png
  • sc class-pattern -f 查询当前类的成员变量信息(需要配合参数-d一起使用)image.png

2.sm 查看已加载类的方法信息,只能看到由当前类所声明的方法,父类则无法看到

  • sm class-pattern 查看类下的所有方法image.png

  • sm class-pattern method-pattern -d 查看指定方法的详细信息image.png

3.mc.java文件编译成.class字节码文件

  • image.pngimage.png
  • mc 待编译文件路径 -d 文件存放路径 指定编译后的文件存放位置image.png

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 反编译字节码文件并保存在指定目录下image.png

  • vim ArthasController.java编辑文件,修改返回值从 HelloWorld 改为 HelloWorld-redefineimage.pngimage.png

  • sc com.easysan.study.arthas.controller.ArthasController -df 获取类加载器hash值image.png

  • mc -c 67e051ff /usr/local/arthas/ArthasController.java -d /usr/local/.java文件编译为 .class文件image.png

  • redefine -c 67e051ff /usr/local/com/easysan/study/arthas/controller/ArthasController.class 重新加载.class文件到内存中image.png

  • image.png