我们都知道了类加载的时间点,那么jvm是通过什么方式对类进行加载的呢?就是类加载器。
那接下来我们就来聊聊jvm的类加载器。
jvm培训
jvm的类加载器总体上可以分成4层,我们一起看一下。
1.启动类加载器
首先是JVM启动的第一步,即BootstrapClassLoader,它主要用于加载Java的核心类。
我相信每个人都知道,无论运行Java程序的链接是什么,都必须安装jvm虚拟机环境,并且该环境的目录中有一个lib文件夹。该文件是核心Java类库。支持java系统的运行。
因此,一旦启动了jvm,将首先通过启动类加载器来加载lib文件夹下的核心类库。
2.扩展类加载器
然后我们就到了第二层,扩展类加载器ExtensionClassLoader,这个类加载器其实与启动类加载器是类似的。
在我们的jvm虚拟机环境目录下,是有一个lib/ext的文件夹的,这里面的类就是java运行环境的一些扩展类,这些扩展类就是在jvm启动后,通过扩展类加载器进行加载的。
3.应用程序类加载器
加载完核心类库和扩展类,这时候就到了第三层,应用程序类加载器ApplicationClassLoader,这个类加载器你就可以理解成是加载我们写好的java代码的就可以了。
4.自定义类加载器
第一步是JVM启动的第一步,即BootstrapClassLoader,它主要用于加载Java的核心类。
我相信每个人都知道,无论运行Java程序的链接是什么,都必须安装jvm虚拟机环境,并且该环境的目录中有一个lib文件夹。该文件是核心Java类库。支持java系统的运行。
因此,一旦启动jvm,将首先通过启动类加载器来加载lib文件夹下的核心类库。
这就是双亲委派机制。
举个例子,假如我们的应用程序类加载器要加载一个类A,那么首先它会先回家找它老爸扩展类加载器,问问“老爸,你那有这个类A吗?”
然后扩展类加载器接到这个请求之后,同样也懒得处理,再去找它爷爷启动类加载器。
它爷爷找了一圈没找到类A,很生气,就对扩展类加载器说,“我这没有,你自己找去!”
然后扩展类加载器就灰溜溜的自己找了一圈,同样也没找到,这时候就找到应用类加载器了,说:“我这哪有你这个类A,这明明是你自己应该干的活,爱上哪找上哪找去,我不管了”。
这时候应用类加载器就只能自己去处理了,找了一圈发现找到了类A,就把它加载到jvm内存中了。
相信大家看了这个例子应该很容易理解了吧。
所以假设我们自己创建了一个类java。lang。String,它是不会被应用类加载器加载到内存中的,因为父类中可以找到这个类,就直接给加载到内存中了。
推荐阅读:jvm培训:如何判断哪些对象需要回收?
如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1037935907,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!