JVM——Java加载原理双亲委派模型

JVM——Java加载原理双亲委派模型

  由于类加载阶段分为:加载,连接(内含准备),初始化三个阶段。而Java将加载阶段提取出来使用类加载器实现。对于Java中任意一个类都是由这个类全限定名加载这个类的类加载器唯一确定
  一、类的3种默认类加载器
   1、BootStrap ClassLoader启动类加载器:所有类加载器的父类,负责将JAVA_HOME/lib下的核心类库或-Xbootclasspath指定的jar包加载到内存中。
   2、Extension ClassLoader扩展类加载器:负责将JAVA_HOME/lib/ext或被系统变量-Djava.ext.dir指定位置的类库加载到内存中。
   3、Application ClassLoader应用程序类加载器:负责将用户类路径classPath的类库加载到内存中。
  二、类的双亲委派模型

在这里插入图片描述

  非常经典的图,双亲委派的流程也可以分为两步:
   1、自底向上检查:如果一个类加载器(默认是Application ClassLoader)收到了类加载请求,先从下往上检查是否已经有类加载器加载了该类,若有,则直接返回该类实例引用。
   2、自顶向下加载:若找到BootStrap还没找到已加载好的类,则开始从上往下进行加载该类,如果当前类加载器可以成功加载,则直接返回结果,如果不能成功加载,就抛出异常,下一级别的类加载器继续加载,如果直到最底层类加载器(自定义/默认为Application ClassLoader)还没有成功加载,将该异常(ClassNotFoundException)抛给用户程序。
  三、注意事项:
   双亲委派模型的好处:使得类有了层次的划分,防止内存中出现多份同样的字节码。
   若现在有人自定义了一个Object类,内容嵌套了不好的代码,路径和核心类中的Object路径设置的一模一样。此时,由于双亲委派模型的存在,最终加载的还是核心类的Object。
   无论使用哪个类加载器(BootStrap类加载器不能被Java程序直接调用)经过一层层的双亲委托,最终都会到达BootStrap类加载器,而BootStrap根据对应的路径直接加载核心类中的Object,这就使得核心类的基本代码被保护起来。
   如果将这个自定义类打成jar包放到JAVA_HOME/lib中,由于虚拟机的安全机制,BootStrap是不会加载JAVA_HOME/lib目录下存在的陌生类,只能加载该目录下它可以识别的类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值