Java ClassLoader原理

ClassLoader概念

ClassLoader是用来动态加载class文件到内存中的机制,程序在启动时,并不会一次性加载所有class文件,而是根据程序的需要,通过类加载机制来动态加载,只有class文件被载入到内存中,才能被其他class所用。

java默认提供的三个ClassLoader

  • BootStrap ClassLoader

java类加载层次中最顶层的类加载器,负责加载jdk的核心类库。

  • Extension ClassLoader

扩展类加载器,负责加载java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。

  • App ClassLoader

系统类加载器,负责加载程序classpath目录下的jar和class文件

除了这三个类加载器,用户也可以自定义类加载器。自定义的ClassLoader都必须继承java.lang.ClassLoader(包括extension classLoader和app classLoader)。bootstrap ClassLoader除外,jvm启动后bootstrap classLoader也随之启动,加载完核心类库后,负责构造extension classLoader和app classLoader类加载器。

ClassLoader加载原理

  • 原理

使用双亲委托模型搜索类:当一个ClassLoader需要加载某个类时,会将这个任务委托给它的父类加载器,这个过程是由上至下的,首先由BootStrap ClassLoader试图加载,未加载到则把任务委托给Extension ClassLoader,依次往下至委托的发起者,如果最终并未搜索到该类,则抛出ClassNotFoundException异常。

  • 优点

双亲委托模型可以避免重复加载,当父类已经加载过一次,子类就没有必要再加载了。

  • jvm判断

jvm在搜索类的时候,不仅要判断两个类的类名是否相同,还要判断是否是同一类加载器加载的实例。两者同时满足,则认为这两个类是相同的。

ClassLoader的加载体系

1.自底向上检查类是否已加载
2.自顶向下尝试加载类

自定义的ClassLoader

自定义的ClassLoader分两步:
1.继承java.lang.ClassLoader
2.重写父类的findClass方法

点击查看原文

推荐阅读更多精彩内容