开发者学堂课程【线上问题排查利器 Alibaba Arthas(下):classloader 命令的使用】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/747/detail/13200
classloader 命令的使用
内容介绍:
一、介绍及作用
二、参数说明
三、作用小结
一、介绍及作用
类加载器,是所有与类和类加载器相关的最后一条命令,这条命令的参数比较多,它的主要作用是获取类加载器的信息,在一个程序运行过程当中不止一个类加载器,那就需要获取所有的类加载器信息。
它的主要的应用场景也就是作用有以下两个:
1. classloader 命令将 JVM 中所有的 classloader 的信息统计出来,主要是统计类个数,可以显示类加载器的结构,继承结构,甚至可以查找资源所在的包,也可以获取类加载器所在的包并可以展示继承树, urls 等。
2.第二个应用场景用的比较多的地方是当你的程序在运行过程中,某个资源突然找不到,通过这条命令,可以获取资源,在某个 jar包里边可以让指定的 classloader 去 getResources ,打印出所有查找到的 resources 的 url ,对于
ResourceNotFoundException 异常比较有用。
二、参数说明
下面先来看一下参数的说明,然后进行具体演示:
[l]:按类加载实例进行统计
[t]:打印所有 ClassLoader 的继承树
[a]:列出所有 ClassLoader 加载的类,请谨慎使用
[c:]: ClassLoader 的 hashcode
[ c : r :]:用 ClassLoader 去查找 resource
[ c : load :]:用 ClassLoader 去加载指定的类
以上所有参数都是可选的,不带任何参数也都可以
1、不带参数
使用这个 ClassLoader,然后回车,不带有任何参数就可以看到所用的类加载器,在如图所示中,我们可以看到有四个类加载器,第一列显示的,类加载器的名字,第二列是示例的数量,第三列是所有加载类的总数,以上是不带有任何参数的情况下
2、下面来看[l]参数:
与不带参数的相差不大,它的第二列等同于不带参数的第三列,第一列还是类加载器的名字,区别是后边多了两列,第三列是加载器的hash code,第四列是类加载器的副类加载器,可以看到有两个null,null表示这个是一个顶层的类加载器,再往上走就接近操作系统了,就变成C语言写的类加载器之类,这一列有两个说明他们两个都是最顶层的了。中间的两个我们可以看到是相同的副类加载器,说明是兄弟关系。
3、下面来看[a]参数:
[a]:用来列出所有 ClassLoader 加载的类,要请谨慎使用
这个类加载器已经加载了所有的类并列了出来,所以没有可读性要谨慎使用,大家可以看下面这段部分代码图片,图中绝大多数是第一个类加载器加载的,是它的子类继承下来的。
下面来看其他的几个参数,
4、[c:]参数用的比较多,你可以指定一个类加载器的hash code,去查看他的信息
通过输入-l回车先来查看它的hash code
然后-c输入某个类加载器的hash Code,以Arthas的类加载器为例,拷到-c后面来后回车,这样就这一找到该类加载器所在的包,找到类加载器到底在那个 jar包里面
5.带两个类加载器的[ c : r :]
-r可以用类加载器去查找指定的资源,不仅可以用来找文件,还可以找某个Java class的字节码的文件在哪个 jar包。下面是两个例子:
第一个我们可以找一个MANIFEST,在很多架包下面都有META-INF这是它的原数据原信息,如果我们要找它的元数据,就可以带一个-r的参数,按回车后如下图,这时候就找到了MANIFEST.MF这个文件的
所在包
还可以用来找某一个类的字节码文件在那个包里,比如说想知道Java string类在那个包,此时要注意写法上用“/”,因为他是一种资源一个路径,所以要写全写成java./lang/String.class
“.class”表示了要找的是一种字节码文件,回车后就找到了在rt这个包里
6、 c : load
这个参数用来加载指定的类,指定加载的类全名,就会显示类加载成功和一些类的信息,类的名字,是否是接口,是否是注解,是否是匿名的类等等,还有他的名字,访问修饰符,以及他实现的接口,还有它的副类是什么等,可以用它来操作类加载器
三、作用小结
下面小结类加载器的四个作用:
1.显示所有类加载器的信息
2.获取某个类加载器所在的 jar 包
3.获取某个资源在哪个 jar 包中
4.加载某个类