class 和 classloader 相关命令: sc 和 sm | 学习笔记

简介: 快速学习 class 和 classloader 相关命令: sc 和 sm

开发者学堂课程【线上问题排查利器 Alibaba Arthas(上)class 和 classloader 相关命令: sc 和 sm学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/746/detail/13194


class 和 classloader 相关命令: sc 和 sm


内容介绍

一、简介

二、Search Class

三、Search Method

四、总结


一、简介

在讲解完 JVM 相关命令后,学习 class/classloader 相关的命令,将分三组介绍。

本课介绍和类相关的两个命令:

1.SC:Search Class ;缩写为 SC,搜索类

2.SM:Search Method ;缩写 SM,搜索方法


二、Search Class

1.SC 作用:

查看 JVM 虚拟机中已经加载的类的信息。“Search-Class”的简写 SC (查看类的信息),该命令能搜索出所有已经加载到JNM中的Class信息, sc 默认开启子类匹配功能,也就是说不仅能搜索该类,并且能够搜索所有当前类的子类的信息,可能会显示出很多信息。假如不希望搜索子类,想要精确的匹配,请打开options disable-sub-class true开关。

2.SC 参数:

共有五个参数,参数一和参数二后可带其他参数

(1)class-pattern :类名匹配表达式,支持全限定名(匹配类的名字);将包全部写出,点明类。后来的新版本也支持斜杠的方式,考虑的更加人性化,从异常堆栈里把类名拷贝过来的时候,不需要在手动把/替换为.

例如:com.taobao.test.AAA,也支持com/taobao/test/AAA斜杠的方式

(2)method-pattern:方法名表达式匹配(匹配方法)

(3)[d]:输出当前类的详细信息,包括该类所加载的原始文件来源、类的声明、加载的 ClassLoader 等详细信息。如果一个类被多个 ClassLoader 所加载,则会出现多次

(4)[E]:开启正则表达式匹配,如果不加-[E],默认为通配符匹配

(5)[f]:输出当前类的成员变量信息(不仅显示类,还会显示类的成员变量)需要配合参数 -d 一起使用。

SC 命令的使用:

数学游戏的例子还在运行,所以清除屏幕

Clear,点击回车键

image.png

运行 java -jar arthas-boot.jar,点击回车键

提示3658和8563的俩个端口号已经被占用,已经在3658上

image.png

根据提示按数字2,出现报错

image.png

重新复制java -jar arthas-boot.jar -- telnet-port --http-port -1代码,用新的端口号9998代替,点击回车键

image.png

根据提示按数字1,点击回车键

image.png

尝试连接13059

image.png

(1)模糊搜索,demo包下的所有类

使用第一条命令 SC( SC 支持通配服务),或者使用代码 sc demo.MathGame,点击回车键。

显示类的信息 demo.MathGame。

使用通配符,代码为 sc demo.*,点击回车键。(效果和上述代码相同,会显示包里所有的类,无含义)

image.png

(2)打印类的详细信息:

加入参数-d(显示详细信息)代码为 sc demo.* -d ,点击回车键。

可详细看到数学类的信息:

image.png

class- info    deno . MathGame     //类的信息,包名叫类名

code-source /root/.arthas/1ib/3.1.7/arthas/arthas- demo.jar

//源代码在 /root/.arthas/1ib/3.1.7/arthas/arthas- demo.jar的Jar包里

Name demo .MathGane          //类的名字

isInterface  false           //是不是类的接口

isAnnotation  false          //是否注解

isEnum false                 //是否枚举

isAnonymousClass  false        // 是否例名

isArray   false             //是否宿主

isLocalClass                //false 是否本地类

iSMemberClass                //false 是否成员类                  

isPrimitive          

isSynthetic         false

simple- name      MathGame          //简单的类名

modifier            public

annotation

interfaces

super-class          +-java.lang.object            父类

class-loader    +-sun.misc Launcher$AppClassLoader@7edea4e

+-sun.misc.Launcher$ExtClassLoader@1b6d3586 #类加载器

classLoaderHash     70dea4e       #类加载器的 HashCold

(3)打印出类的Field信息

参数 -df (不仅显示详细信息,还显示数学类当中的成员变量),代码为sc demo.* -df ,点击回车键

image.png

上半部分与上述 sc demo.* -d显示效果相同,下半部分多余了fields 数学类当中的成员变量

//第一个成员变量

fields   name       random           //成员变量名称

type       java . util. Random   //成员变量类型

modifier    private,static              

value      java . util .Random@620bb81b  

// 成员变量的值,显示Random@620bb81b地址

//第二个成员变量

name     illega lArgumentCount

//成员变量名称,非法参数统计

type      int                 //成员变量类型

modifier      public

三、Search Method

1.SM作用:

查看已加载类的方法信息,"Search-Method"的简写(搜索方法),在程序运行过程中,不仅可以看到类的信息,也能看到方法的信息, SM命令能搜索出所有已经加载了 Class 信息的方法信息。 sm 命令只能看到由当前类所声明( declaring ) 的方法,父类的方法则无法看到。

对比: SC 可以看类,成员的属性。

2.参数说明

class-pattern:类名表达式匹配(哪些类,可写出全部类名)

method-pattern:方法名匹配表达式

[d]:展示每个方法的详细信息

[E]:开启正则表达式匹配,如果没有加参数,默认为通配符匹配

3.SM命令的使用:

(1)对比sc和sm:

假设想看数学游戏,代码为 sc demo.MathName ,点击回车键,可看到类

image.png

sm demo.MathName,点击回车键,可得到类的方法信息

image.png

demo.MathGame <init>()V             #构造方法

demo.MathGame primeFactors(I)Ljava/util/List;   #第二个方法,用来输出,java/util/List是返回值,该参数返回了List类型值,和源代码所匹配

demo.MathGame main([Ljava/1ang/string;)V  

//main();[Ljava/1ang/string是参数

demo.MathGame run()V                 //run()

emo.MathGame print(ILjava/util/List;)V         //print()

源代码:在大纲->快速入门: attach 一个进程->步骤->准备代码,正可找到primeFactors(I) 的源代码

数学游戏:public Class MathGame {}中包含以下四种方法;

public static void main(String[] args) throws InterruptedException {}

//main 函数

public void run() throws InterruptedException {}

//run() 函数

public static void print(int number, List<Integer>primeFactors) {}

//print 函数

public List<Integer> primeFactors(int nunber) {}

//primeFactors 函数

(2)显示 String 类加载方法:

sm java.long.String  ,点击回车键

String 会加载很多种类的方法

image.png

(3)String 种类中每个方法的详细信息:

sm java.long.String -d ,点击回车键

将得到更加详细的信息,,以其中一个进行讲解;

declaring- class    demo . MathGame    

method- name    primeFactors      //方法的名字

modifier     public                 //访问修饰符

annotation                  //注解(无 注解)

parameters     int                  //参数,整数类型

return        java.util.List               //返回值,List 类型

Exceptions                              //是否异常

classLoaderHash     70dea4e            //类加载器的 HashCold

image.png

较为详细,所以可以通过 sm 查看类当中方法的信息


四、总结

与类相关的命令:说明

SC:Search Class 显示类相关的信息

Sm:Search Method 显示方法相关的信息

相关文章
|
21天前
|
Java 编译器 Maven
Java“class file contains wrong class”解决
当Java程序运行时出现“class file contains wrong class”错误,通常是因为类文件与预期的类名不匹配。解决方法包括:1. 确保类名和文件名一致;2. 清理并重新编译项目;3. 检查包声明是否正确。
|
3月前
|
前端开发 Java 编译器
classpath中存在多个jar存在同限定名的class classloader会如何加载
总之,合理组织类路径和使用现代化的构建工具,可有效避免类加载冲突,保证应用的稳定运行。
128 8
|
6月前
|
Java API Maven
Java获取当前项目下的文件或目录物理地址System.getProperty(“user.dir“)
Java获取当前项目下的文件或目录物理地址System.getProperty(“user.dir“)
|
Java 数据库连接 mybatis
控制台报错 No constructor found in com.base.entity.Menu matching [java.lang.Integer, java.lang.String]
控制台报错 No constructor found in com.base.entity.Menu matching [java.lang.Integer, java.lang.String]
156 0
控制台报错 No constructor found in com.base.entity.Menu matching [java.lang.Integer, java.lang.String]
|
Arthas 存储 Java
class 和 Classloader 相关命令:dump | 学习笔记
快速学习 class 和 Classloader 相关命令:dump
class 和 Classloader 相关命令:dump | 学习笔记
|
Arthas 测试技术 编译器
class 和 classloader 相关命令:jad 和 mc | 学习笔记
快速学习 class 和 classloader 相关命令:jad 和 mc
class 和 classloader 相关命令:jad 和 mc | 学习笔记
|
Arthas Java 测试技术
class 和 classloader 相关命令:redefine | 学习笔记
快速学习 class 和 classloader 相关命令:redefine
class 和 classloader 相关命令:redefine | 学习笔记
|
Java
jar的MANIFEST.MF配置了Class-Path, java -classpath设置无效
jar的MANIFEST.MF配置了Class-Path, java -classpath设置无效
235 0
|
Java
将JDK动态代理生成的类保存为 .class文件System.setProperty(“sun.misc.ProxyGenerator.saveGeneratedFiles“, “true“)无效
将JDK动态代理生成的类保存为 .class文件System.setProperty(“sun.misc.ProxyGenerator.saveGeneratedFiles“, “true“)无效
781 0
将JDK动态代理生成的类保存为 .class文件System.setProperty(“sun.misc.ProxyGenerator.saveGeneratedFiles“, “true“)无效
|
XML JSON 数据格式
No converter found for return value of type: class java.util.ArrayList错误问题
No converter found for return value of type: class java.util.ArrayList错误问题
No converter found for return value of type: class java.util.ArrayList错误问题