JVM加载机制

仅供学习交流,如有错误请指出,如要转载请加上出处,谢谢

类加载过程

类加载是指类通过JVM加载到内存开始到从内存中卸载出去的过程,其生命周期包括七个阶段:加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using),卸载(Unloading),其中验证,准备和解析统称为链接过程,如下图所示:

类加载器

类加载器作用于类的加载过程,每一个加载器都拥有独立的类名称空间,而JVM中,有两种类型的类加载器,一种是由C++语言实现的启动类加载器(Bootstrap ClassLoader),另一种是由java语言实现的,独立于虚拟机外部,并且全部继承抽象类java.lang.ClassLoader的类加载器

双亲委派模型

在大部分开发程序中,一般都会使用三种系统提供的类加载器

  1. 启动类加载器(Bootstrap ClassLoader):由C++语言编写,负责加载核心java库(存储在/jre/lib)
  2. 扩展类加载器(Extension ClassLoader):由sun.misc.Launcher$ExtClassLoader实现,负责加载java扩展库(存储在
  3. 应用程序类加载器(Application ClassLoader):由sun.misc.Launcher$AppClassLoader实现,负责加载应用程序的java库(存储在java.class.path或CLASSPATH下的类库)

除了以上三个由系统实现的类加载器,还可以自己实现自定义的类加载器,而这些类的关系如下图所示:

如上类加载器的层次关系图,展示类加载器与类加载器之间的层次关系,这被称为双亲委派模型,每一层上面相当于是自己的父类加载器,以组合的模式来复用父类加载器的功能
双亲委派模型的工作过程是:当一个加载器收到加载请求时,他首先会该请求委派给父类加载器去完成,最终传递到顶层的启动类加载器加载,只有当父类加载器加载不了,才会让子加载器自己去尝试加载,这样的话,可以防止代码的重复,比如A类的加载器要加载System,B类加载器也要加载System,双亲委派机制可能在系统实现的三个类加载器就可以加载了。

参考

https://book.douban.com/subject/24722612/