理解ClassLoader双亲委托模型关键

来源:互联网 发布:java读取文本文件内容 编辑:程序博客网 时间:2024/05/17 09:12

看图

  1. Bootstrap classLoader:采用native code实现,是JVM的一部分,主要加载JVM自身工作需要的类,如java.lang.*、java.uti.*等; 这些类位于$JAVA_HOME/jre/lib/rt.jar。Bootstrap ClassLoader不继承自ClassLoader,因为它不是一个普通的Java类,底层由C++编写,已嵌入到了JVM内核当中,当JVM启动后,Bootstrap ClassLoader也随着启动,负责加载完核心类库后,并构造Extension ClassLoader和App ClassLoader类加载器。
  2. ExtClassLoader:扩展的class loader,加载位于$JAVA_HOME/jre/lib/ext目录下的扩展jar。
  3. AppClassLoader:系统class loader,父类是ExtClassLoader,加载$CLASSPATH下的目录和jar;它负责加载应用程序主函数类。

关键1

在一个自定义的classloader  A接收到加载类的指令时,首先查看缓存里有没有,没有的话就交给其父亲B(extension classloader)去加载;同理 父亲B接到这个指令时也会先检查缓存里是否已经加载了,如果缓存中没有就去叫它的父亲C(Bootstrap classloader)去找

C说:我给你看一下%JAVA_HOME%/lib下有这个类没,如果还是找不到的话就只有你自己去找了,因为我只能到这个目录下去找哦 亲;

如果C没有找到,B就说还是我到%JAVA_HOME%/lib/ext下去给你找找,我只能访问这个目录哦 亲;

如果B没有找到,就对A说:你要找的类是不是在你的工程lib下哟?如果是的话你就自己去找吧,B说:“我靠 找到了 果然在工程的lib下“

这就是完整的加载类过程;


之前我理解的所有的类都是 bootstarp classloader加载的,这个说法是错的。

关键2

虚拟机判断两个类是否相同类依据:1、全类名是否一致   2、是否由相同类加载器

关键3

JAVA虚拟机不是一下子加载所有工程里的class文件的,而是需要时才会加载,比如 一个类里引用了某个类,或者用了new关键字等

附:

JAVA虚拟机加载class文件步骤
1、装载:查找和导入Class文件 
2、链接:其中解析步骤是可以选择的 
 (a)检查:检查载入的class文件数据的正确性
 (b)准备:给类的静态变量分配存储空间 
 (c)解析:将符号引用转成直接引用 
3、初始化:对静态变量,静态代码块执行初始化工作


原创粉丝点击