不同的ClassLoader加载类的方式有所不同,通过双亲委派机制让不同的ClassLoader相互协作,形成一个整体。

JAVA面试准备之JVM JAVA面试准备之JVM ClassLoader的双亲委派机制

 

首先先从Custom ClassLoader开始查找是否加载过该类,如果加载过,直接返回,如果没有加载过,委派给parent类,让parent查找是否加载过该类。一直到Bootstrap ClassLoader,如果还是没有加载过该累。则开始自顶而下尝试加载类,加载到类时,保存在对应的ClassLoader中并返回。

 

源码:

 

JAVA面试准备之JVM JAVA面试准备之JVM ClassLoader的双亲委派机制

JAVA面试准备之JVM JAVA面试准备之JVM ClassLoader的双亲委派机制

JAVA面试准备之JVM JAVA面试准备之JVM ClassLoader的双亲委派机制

 

 

看下当前的classLoader是否加载过类,加载过直接返回。没有加载过,交给parent加载(Custom ClassLoader的parent->AppClassLoader的parent->ExtClassLoader的parent-> Bootstrap ClassLoader)

Parent为空,说明当前的loader是Custom ClassLoader,是C++编写的代码

JAVA面试准备之JVM JAVA面试准备之JVM ClassLoader的双亲委派机制

 

找findBootstrapClass方法的实现代码:

 

 

JAVA面试准备之JVM JAVA面试准备之JVM ClassLoader的双亲委派机制

JAVA面试准备之JVM JAVA面试准备之JVM ClassLoader的双亲委派机制

JAVA面试准备之JVM JAVA面试准备之JVM ClassLoader的双亲委派机制

 

为什么要使用双亲委派机制去加载类?

避免多份同样字节码的加载。内存是宝贵的,没必要保存两份相同的类对象。使用委托机制,在加载类对象时,就会从ClassLoader开始,逐层向父类查找,看看哪一个ClassLoader装载过这个类。

比如类A和类B都要使用System对象,类A第一次在Bootstrap ClassLoader装载了System对象,类B就直接从Bootstrap ClassLoader中获取已经装载了的System对象,无需再在内存中再装载一次System对象。

相关文章: