JAVA双亲委派机制

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

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类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子加载器再加载一次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值