java双亲委派机制

2021-05-30 11:05

阅读:546

标签:blog   就会   dea   lips   expand   动作   exp   dex   应用程序   

当你处在最低谷时,不管往哪里走,都是进步!

 

java类加载及双亲委派机制

java类加载流程

  1. 执行javac命令,启动java编译程序,将.java源代码文件编译为jvm可识别的.class字节码文件。

    (我们用idea、eclipse编码出的就是.java源文件,启动后。target文件夹下就是编译后的.class字节码文件)

  2. 类加载器,将.class文件的二进制数据读入到内存中,存放到jvm内存结构的方法区内,并在堆中创建对应的class对象实例

  3. 执行java命令,会启动jvm,加载运行时所需的类库,并执行class文件。

    技术图片

     

     

结合上图jvm内存结构可知,类加载的最终产品是位于堆中的class对象实例,class封装了类在方法区的数据结构

堆存在的对象实例,方法区存储了类信息,常量

双亲委派机制

1. 三层类加载器

 

技术图片

java提供了三层类加载器,ClassLoader

  • BootstrapClassLoader;启动类加载器,主要负责加载核心的类库,java.lang.*等;

  • ExtClassLoader;扩展类加载器,主要负责加载jre/lib/ext目录下的一些扩展jar;

  • AppClassLoader;程序类加载器,主要负责加载应用程序的主函数类

2. 双亲委派执行流程

当某个.class文件需要加载时

技术图片

 

 

  1. 先在AppClassLoader加载器检查是否已经加载,如果没有加载,不会自己加载,而是将加载动作向上达到父类ExtClassLoader加载器;

  2. 父类ExtClassLoader加载器检查自己是否已经加载,如果没有加载,不会自己加载,继续向上委派给BootstrapClassLoader加载器;

  3. BootstrapClassLoader加载器已经没有父类加载器了,如果没有加载,就要考虑自己是否能加载,自己不能加载,就会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException;

    一个类加载器加载一个类时,首先把加载动作委派给父类加载器,由于类加载器会向上传递加载请求,所以一个类加载时,首先尝试加载它的肯定是启动类加载器

3.通俗的理解双亲委派

简单来说,把类加载器想象为人,自己没有钱就问他爸爸有没有钱,爸爸没有钱,就问爷爷有没有钱,爷爷已经没有人可以要钱了,只能自己赚钱了,发现自己年纪大了赚不了前,就让儿子去赚钱。。。

4. 双亲委派机制优点

  1. 防止了危险代码的植入,整个流程中,BootstrapClassLoader最先加载尝试加载,其他自定义的加载器没有机会执行危险代码的加载;

  2. Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子加载器再加载一次。

  3.  

java双亲委派机制

标签:blog   就会   dea   lips   expand   动作   exp   dex   应用程序   

原文地址:https://www.cnblogs.com/vicious/p/14751424.html


评论


亲,登录后才可以留言!