类加载的过程及双亲委派模型

类加载的过程为:
加载–>连接–>初始化
连接包括:验证–>准备–解析

加载:
“加载”是类加载中的第一个步骤,Java虚拟机需要完成以下三件事:

  1. 通过一个类的全限定名获取定义此类的二进制字节流
  2. 将该二进制类所代表的静态存储结构转化为方法区的运行时数据结构
  3. 在内存中生成一个代表该类的java.lang.Class实例,作为方法区这个类的各种数据的访问入口

验证:
这一阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当做代码运行后不会危害虚拟机自身的安全。
主要归纳为四个方面:文件格式验证、字节码验证、元数据验证、符号引用验证。

准备:
准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置变量的初试值。如果被final修饰的静态变量,则在准备阶段虚拟机就会根据ConstantValue的设置,给该字段的实际值赋上。

解析:
解析阶段是将Java虚拟机将常量池内的符号引用替换为直接引用的过程。

初始化:
在准备阶段时,已经对变量赋过一次系统要求的初始零值,而在初始化阶段,则会根据程序员编码制定的主观计划去初始化类变量和其他资源。

双亲委派模型的工作过程是:
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都会传送到最顶层的启动类加载器中,只有当父类加载器无法完成这个加载请求时(它的搜索范围中没有找到所需要的类),子类加载器才会尝试自己去完成加载。

深入:

当一个类加载器收到某个类的加载请求时,该类加载器不会去加载该类,而是先查看该类加载器的缓存空间是否已经加载了该类,如果已经加载过了就直接返回,如果不存在,则委托给父亲加载器去加载(也是先查看父亲加载器的缓存空间是否已经加载过该类,如果已加载则直接返回),每一层都是如此,如果缓存空间中都没有加载过该类的记录,最终类加载的请求就会传送到顶端的启动类加载器,如果启动类加载器不能加载该类,则返回给拓展类加载器(儿子)去尝试加载,如果还是不能加载,则再到应用类加载器,再到自定义加载器加载

参考文献:《深入理解Java虚拟机》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值