类加载机制和双亲委派模型

第一、类加载过程

首先呢,应用程序在使用我们Java类时,包含以下七个阶段,即生命周期:

1、加载:通过类的全限定名找到.class文件,把它从一个文件的字节流按照虚拟机规定的运行时的数据结构存储在方法区中,最后在虚拟机内存中生成一个代表这个类的class对象,作为访问这些数据的入口

2、验证:检查每个.java文件对应的.class文件所形成的字节流中包含的信息是否符合虚拟机规范的要求,是否存在危害虚拟机安全的代码;

文件格式验证主要是验证class文件格式是否符合虚拟机的要求,能不能被当前虚拟机处理。包含了魔数验证,版本号验证,是否有不支持的常量等等。这个阶段验证完成后才会将class文件中的字节流加载到内存中。
元数据验证数据即是对类的描述数据,主要验证对类的描述数据代表的语义是否符合java的语法,例如,这个类继承的类是否正确,是否实现了接口中所有的方法,类中重载的规则对不对等等。
字节码验证字节码验证主要来验证程序的逻辑是否符合java语法,比如是否有不符合要求的类型转换等。
符号引用验证符号引用是用来保证解析过程能够正常执行,所以符号引用也发生在解析的时候,主要是验证符号引用是否能找到被引用对象等。如果这个class文件已经被反复验证过为了提高效率可以通过设置参数来取消对某个类的验证。

3、准备:为static 修饰的类变量分配内存,并且设置初始值(0、false等),但如果是被final修饰的变量会直接赋对应的值;

4、解析:将符号引用转化为直接引用,这里符号引用就是对引用对象的一个由符号组成的描述符,通过符号引用可以定位到目标。在编译阶段编译器并不知道引用对象的地址所以只能用符号引用来定位目标。直接引用就是目标的地址或者能找到对象的句柄的地址。

5、初始化: 会将类中所有static修饰的类变量、静态语句块执行一遍;

6、使用:使用new 创建对象;

7、卸载:在虚拟机垃圾回收过程中,将类对象实例从虚拟机内存中移除;

 

第二、类加载器(类加载阶段)

类加载器:用于实现类的加载,java中分为以下三种类加载器:

双亲委派模型的过程:

      某个特定的类加载器在接到加载类的请求时,首先不会自身先去尝试加载,而是将加载任务委托给父类加载器,依次递交,直到启动类加载器,如果父类加载器可以完成加载任务,就成功返回;只有父类加载器无法完成加载任务时,才依次向下尝试子类加载器去加载,成功即返回,若直到自身加载器也无法加载,返回ClassNotFoundException。

注:双亲委派模型不是继承关系,是组合关系!

双亲委派模型的好处:

      Java类随着它的加载器一起具备了带有优先级的层次关系,避免一个类被多个加载器重复加载及由于不同加载器加载的类是不一样的,导致程序混乱,这样可以保证虚拟机所用基础类被正确加载,保证了Java程序的稳定运行。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值