类加载器有几种?如何深入理解类加载器?

TheDisguiser 2020-05-07 16:41:11 java常见问答 7267

Java中,类是不可缺少的一部分,了解类的各种运行机制是必然的,今天小编就来带你们深入了解一下类加载器的各种原理吧。

类加载器种类

Java类加载器会采用双亲委派模型:

类加载器

1.Bootstrp loader

Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类。

2.ExtClassLoader

Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.ExtClassLoader是用Java写的,具体来说就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库。

3.AppClassLoader

Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为 ExtClassLoader。AppClassLoader也是用Java写成的,它的实现类是 sun.misc.Launcher$AppClassLoader,另外我们知道ClassLoader中有个getSystemClassLoader方法,此方法返回的正是AppclassLoader.AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档,它也是Java程序默认的类加载器。

4.自定义加载器:用户自己定义的类加载器。

类装载方式

a隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。

b显式装载, 通过class.forname()等方法,显式加载需要的类

类加载的动态性体现

java应用程序一般是由n个类组成,在程序启动时,并不是一次把所有的类全部加载后再运行,它会先保证程序运行的基础类能够一次性加载到jvm中,等其它类用到JVM的时候再加载,这样就节省了内存的开销,java最早就是为了嵌入式系统而设计的,内存十分珍贵,所以这样节省内存是必然的,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现。

以上就是全部内容了,想了解更多java基础知识,就请多多关注我们的java常见问答栏目吧。

推荐阅读:

类的加载流程是怎么进行的?