classloader 命令的使用 | 学习笔记

简介: 快速学习 classloader 命令的使用

开发者学堂课程【线上问题排查利器 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 异常比较有用。


二、参数说明

下面先来看一下参数的说明,然后进行具体演示:

image.png

[l]:按类加载实例进行统计

[t]:打印所有 ClassLoader 的继承树

[a]:列出所有 ClassLoader 加载的类,请谨慎使用

[c:]: ClassLoader 的 hashcode

[ c : r :]:用 ClassLoader 去查找 resource

[ c : load :]:用 ClassLoader 去加载指定的类

以上所有参数都是可选的,不带任何参数也都可以

1、不带参数

image.png

使用这个 ClassLoader,然后回车,不带有任何参数就可以看到所用的类加载器,在如图所示中,我们可以看到有四个类加载器,第一列显示的,类加载器的名字,第二列是示例的数量,第三列是所有加载类的总数,以上是不带有任何参数的情况下

2、下面来看[l]参数:

image.png

与不带参数的相差不大,它的第二列等同于不带参数的第三列,第一列还是类加载器的名字,区别是后边多了两列,第三列是加载器的hash code,第四列是类加载器的副类加载器,可以看到有两个null,null表示这个是一个顶层的类加载器,再往上走就接近操作系统了,就变成C语言写的类加载器之类,这一列有两个说明他们两个都是最顶层的了。中间的两个我们可以看到是相同的副类加载器,说明是兄弟关系。

3、下面来看[a]参数:

[a]:用来列出所有 ClassLoader 加载的类,要请谨慎使用

这个类加载器已经加载了所有的类并列了出来,所以没有可读性要谨慎使用,大家可以看下面这段部分代码图片,图中绝大多数是第一个类加载器加载的,是它的子类继承下来的。

image.png

下面来看其他的几个参数,

4、[c:]参数用的比较多,你可以指定一个类加载器的hash code,去查看他的信息

通过输入-l回车先来查看它的hash code

image.png

然后-c输入某个类加载器的hash Code,以Arthas的类加载器为例,拷到-c后面来后回车,这样就这一找到该类加载器所在的包,找到类加载器到底在那个 jar包里面

image.png

5.带两个类加载器的[ c : r :]

-r可以用类加载器去查找指定的资源,不仅可以用来找文件,还可以找某个Java class的字节码的文件在哪个 jar包。下面是两个例子:

第一个我们可以找一个MANIFEST,在很多架包下面都有META-INF这是它的原数据原信息,如果我们要找它的元数据,就可以带一个-r的参数,按回车后如下图,这时候就找到了MANIFEST.MF这个文件的

所在包

image.png

还可以用来找某一个类的字节码文件在那个包里,比如说想知道Java string类在那个包,此时要注意写法上用“/”,因为他是一种资源一个路径,所以要写全写成java./lang/String.class

“.class”表示了要找的是一种字节码文件,回车后就找到了在rt这个包里

image.png

6、 c : load

这个参数用来加载指定的类,指定加载的类全名,就会显示类加载成功和一些类的信息,类的名字,是否是接口,是否是注解,是否是匿名的类等等,还有他的名字,访问修饰符,以及他实现的接口,还有它的副类是什么等,可以用它来操作类加载器

image.png


三、作用小结

下面小结类加载器的四个作用:

1.显示所有类加载器的信息

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

3.获取某个资源在哪个 jar 包中

4.加载某个类

相关文章
|
7月前
|
前端开发 Java 应用服务中间件
【面试题精讲】JVM-类加载器-Java中的默认类加载器
【面试题精讲】JVM-类加载器-Java中的默认类加载器
|
Java
JVM - 实现自定义的ClassLoader就是这么简单
JVM - 实现自定义的ClassLoader就是这么简单
89 0
|
安全 前端开发 Java
JDK源码(16)-ClassLoader
JDK源码(16)-ClassLoader
JDK源码(16)-ClassLoader
|
安全 前端开发 Java
ClassLoader 加载| 学习笔记
快速学习 ClassLoader 加载
ClassLoader 加载| 学习笔记
|
Arthas Java 测试技术
class 和 classloader 相关命令:redefine | 学习笔记
快速学习 class 和 classloader 相关命令:redefine
class 和 classloader 相关命令:redefine | 学习笔记
|
Arthas 存储 Java
class 和 Classloader 相关命令:dump | 学习笔记
快速学习 class 和 Classloader 相关命令:dump
class 和 Classloader 相关命令:dump | 学习笔记
|
Arthas 测试技术 编译器
class 和 classloader 相关命令:jad 和 mc | 学习笔记
快速学习 class 和 classloader 相关命令:jad 和 mc
class 和 classloader 相关命令:jad 和 mc | 学习笔记
|
安全 前端开发 Java
ClassLoader加载|学习笔记
快速学习ClassLoader加载
ClassLoader加载|学习笔记
|
前端开发 Java 开发者
Java---类加载器(ClassLoader)
类加载器 classloader的加载过程