JVM——Java加载原理双亲委派模型
最新推荐文章于 2022-03-25 15:21:53 发布
这个类全限定名
和加载这个类的类加载器
来唯一确定
。BootStrap ClassLoader启动类加载器
:所有类加载器的父类,负责将JAVA_HOME/lib
下的核心类库或-Xbootclasspath
指定的jar包加载到内存中。Extension ClassLoader扩展类加载器
:负责将JAVA_HOME/lib/ext或被系统变量-Djava.ext.dir指定位置的类库加载到内存中。Application ClassLoader应用程序类加载器
:负责将用户类路径classPath的类库加载到内存中。自底向上检查
:如果一个类加载器(默认是Application ClassLoader)收到了类加载请求,先从下往上检查是否已经有类加载器加载了该类,若有,则直接返回该类实例引用。自顶向下加载
:若找到BootStrap还没找到已加载好的类,则开始从上往下进行加载该类,如果当前类加载器可以成功加载,则直接返回结果,如果不能成功加载,就抛出异常,下一级别的类加载器继续加载,如果直到最底层类加载器(自定义/默认为Application ClassLoader)还没有成功加载,将该异常(ClassNotFoundException)抛给用户程序。双亲委派模型的好处
:使得类有了层次的划分,防止内存中出现多份同样的字节码。BootStrap类加载器不能被Java程序直接调用
)经过一层层的双亲委托,最终都会到达BootStrap类加载器,而BootStrap根据对应的路径直接加载核心类中的Object,这就使得核心类的基本代码被保护起来。BootStrap是不会加载JAVA_HOME/lib目录下存在的陌生类
,只能加载该目录下它可以识别的类。