开发者学堂课程【线上问题排查利器 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,点击回车键
运行 java -jar arthas-boot.jar,点击回车键
提示3658和8563的俩个端口号已经被占用,已经在3658上
根据提示按数字2,出现报错
重新复制java -jar arthas-boot.jar -- telnet-port --http-port -1代码,用新的端口号9998代替,点击回车键
根据提示按数字1,点击回车键
尝试连接13059
(1)模糊搜索,demo包下的所有类
使用第一条命令 SC( SC 支持通配服务),或者使用代码 sc demo.MathGame,点击回车键。
显示类的信息 demo.MathGame。
使用通配符,代码为 sc demo.*,点击回车键。(效果和上述代码相同,会显示包里所有的类,无含义)
(2)打印类的详细信息:
加入参数-d(显示详细信息)代码为 sc demo.* -d ,点击回车键。
可详细看到数学类的信息:
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 ,点击回车键
上半部分与上述 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 ,点击回车键,可看到类
sm demo.MathName,点击回车键,可得到类的方法信息
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 会加载很多种类的方法
(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
较为详细,所以可以通过 sm 查看类当中方法的信息
四、总结
与类相关的命令:说明
SC:Search Class 显示类相关的信息
Sm:Search Method 显示方法相关的信息