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 显示方法相关的信息

相关文章
|
Prometheus 监控 Cloud Native
SpringBoot系列之Prometheus自定义埋点上报
之前介绍了一篇SpringBoot集成Prometheus实现数据上报的博文,在前面一篇博文中,更多的是一个SpringBoot应用如何最小成本的接入Prometheus,并结合Grafana配置一个完整的应用监控大盘 有看过前文的小伙伴可能知晓,SpringBoot接入Prometheus之后,基本上不用做额外的开发,就已经实现了我们关心的JVM情况、GC情况、HTTP调用请求等信息,然而在实际的业务开发过程中,我们总会遇到一些需要手动上报的场景,那么我们可以怎么处理呢?
2179 0
SpringBoot系列之Prometheus自定义埋点上报
|
存储 缓存 Linux
【实战指南】嵌入式RPC框架设计实践:六大核心类构建高效RPC框架
在先前的文章基础上,本文讨论如何通过分层封装提升一个针对嵌入式Linux的RPC框架的易用性。设计包括自动服务注册、高性能通信、泛型序列化和简洁API。框架分为6个关键类:BindingHub、SharedRingBuffer、Parcel、Binder、IBinder和BindInterface。BindingHub负责服务注册,SharedRingBuffer实现高效数据传输,Parcel处理序列化,而Binder和IBinder分别用于服务端和客户端交互。BindInterface提供简单的初始化接口,简化应用集成。测试案例展示了客户端和服务端的交互,验证了RPC功能的有效性。
760 79
|
11月前
|
Java 关系型数据库 数据库
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
877 1
|
存储 人工智能 云计算
《云计算平台上 C++构建可弹性扩展人工智能应用之路》
在数字化时代,云计算与C++的结合正重塑行业创新。C++凭借其高性能和对底层资源的精细控制,在云计算环境中开发弹性扩展的人工智能应用中扮演着关键角色。本文探讨了二者结合的优势、挑战及应对策略,包括资源动态分配、负载均衡、数据管理等方面,并通过智能安防和金融风险预测的成功案例,展示了C++在云计算平台上的应用潜力,展望了未来的发展趋势。
244 7
|
云安全 算法 数据建模
阿里云SSL证书免费版申请流程,收费版证书收费标准及证书类型选择参考
SSL证书是实现网站https访问必须购买的云安全类产品,现在很多用户在网站做好之后,下一步通常都是给网站域名购买SSL证书实现网站的https访问,阿里云提供申请SSL证书服务,现在每个阿里云个人或企业用户(以实名认证为准)每年可以一次性申请20张免费Digicert DV单域名试用证书(以下简称免费证书),本文为大家介绍具体的申请流程和收费证书的最新收费标准以及不同种类的证书选择参考。
阿里云SSL证书免费版申请流程,收费版证书收费标准及证书类型选择参考
|
Oracle Java 关系型数据库
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
如果遇到"exec format error"问题,文章建议先检查Linux操作系统是32位还是64位,并确保安装了与系统匹配的JDK版本。如果系统是64位的,但出现了错误,可能是因为下载了错误的JDK版本。文章提供了一个链接,指向Oracle官网上的JDK 17 Linux版本下载页面,并附有截图说明。
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
|
Oracle Ubuntu Java
cannot execute binary jdk问题
【7月更文挑战第15天】
966 5
|
编译器 C++
C++ max函数与min函数
C++ max函数与min函数
741 0
|
数据采集 存储 人工智能
cdga|数据治理:应对核心业务数据质量参差不齐的挑战与策略
数据治理是指通过制定并实施一系列政策、流程和技术手段,确保数据的可用性、完整性、准确性和安全性,以支持企业的决策和业务运营。对于核心业务数据质量参差不齐的问题,数据治理的重要性不言而喻
1010 0
|
存储 程序员 Shell
【C/C++ 基本语法 结构体】C++ 结构体声明(定义)以及不同写法的差异
【C/C++ 基本语法 结构体】C++ 结构体声明(定义)以及不同写法的差异
474 1