Arthas的classloader相关命令

sc

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

参数说明:

image-20211031092636279

image-20211031092747136

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

image-20211031092820532

sc demo.* -df

sm

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

参数说明:

image-20211031093034387

image-20211031093103777

sm demo.*

image-20211031093209479

sm demo.* -d

jad

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

直接反编译一个类:

jad java.lang.String

image-20211031093654080

jad demo.MathGame

image-20211031093716693

反编译时只显示源代码:

jad --source-only demo.MathGame

image-20211031093827839

反编译指定的函数:

jad demo.MathGame main

image-20211031093911903

mc

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

mc /usr/local/arthas/Test.java -d /usr/local/arthas/

image-20211031094728479

image-20211031094901733

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 也可以用你个人平时喜欢的编辑方式修改也可以:

image-20211031115148243

System.out.println("while-run");
System.out.println("new Code");

使用 mc 命令对字节码重新编译,将 java 文件编译成 class 文件:

mc /usr/local/arthas/MathGame.java -d /usr/local/arthas

image-20211031115801510

使用 redefne:

redefine /usr/local/arthas/demo/MathGame.class

image-20211031120027551

dump

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

dump demo.*

image-20211031120518292

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

image-20211031120646231

classloader

显示所有类加载器信息:

classloader -l

image-20211031121100487

获取某个类加载器所在的 jar 包:

classloader -c hash

image-20211031121142425

获取某个资源所在的 jar 包:

classloader -c hash -r META-INF/MANIFEST.MF

image-20211031132348919

加载某个类到内存当中:

classloader -c hash -load java.lang.String

image-20211031121820652

End

posted @   BNTang  阅读(431)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示