JVM类加载机制

一,概述

1.虚拟机如何加载这些Class文件呢?虚拟机把描述类的数据从Class文件加载到内存里面,并对数据进行校验,准备解析以及初始化,最终形成可以直接被j虚拟机直接使用的java类型文件,这就是java虚拟机的类加载机制。(加载过程在程序运行期间完成)
2.类从加载到整个被卸载的过程为:加载,验证,准备,解析,初始化,使用,卸载 总共7个阶段。
其中验证,准备,解析三个部分称为连接。
3.加载,验证,准备,初始化,卸载这五个部分是固定顺序的,注意:解析可以在初始化之后才开始(为了加载时的动态绑定)
4.但是这些阶段是可以互相交叉的进行工作的,通常在一个阶段的执行过程中去激活另一个阶段。
5.类加载中五种强制的类初始化情况

(1)遇到new关键字,实例化对象的时候。
(2)使用java.lang.reflect包的方法进行反射调用的时候,如果类没有进行过初始化则需要先触发其初始化。
(3)当初始化一个类时,发现他的父类没有初始化,则就会触发它的父类进行初始化。
(4)当虚拟机启动时,用户需要指定一个执行的主类(main的那个类),虚拟机会先初始化这个类。
(5)实例解析结果为REF_getStatic等的方法句柄,并且这个方法的句柄对应的类没有进行过初始化,则先触发其初始化。

注意:以上五种情况为:一个类进行的主动引用。其他的都称为被动引用。
6.类加载与接口加载的区别

(1)接口也是有类加载的,这点与类是一致的,类的在过程用代码块static{}来输出初始化信息,而接口不能使用静态语句块的信息。
(2)编译器会为接口生成“()” 类构造器,用于初始化接口所定义的成员变量。
(3)当一个类在初始化前,要求其父类已经全部初始化,但是一个接口在初始化时并不会要求其父接口已经全部初始化了。只有在真正使用到父接口的时候才会初始化。

二,类加载的过程

1.加载(加载阶段,虚拟机需要完成的三件事情)
(1)通过一个类的全限定名来获取定义此类的二进制字节流
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
(3)在内存中产生一个Class对象,作为方法区的这个类的各种数据结构的访问入口。

注意:(1)加载阶段可以使用系统提供的类加载器也可以使用用户自定义的类加载器去控制字节流的获取方式(也就是重写一个类架加载器的loadClass()方法)。
(2)数组这种数据类型不是有类加载器创建的,它是由虚拟机直接创建的。
(3)加载完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中。。

(4)在内存中实例化的Class对象,并没有明确在堆里还是在方法区里,对于虚拟机而言(HotSpot),Class对象比较特殊,他虽然是对象但是他存储在方法区里,这个对象将作为程序访问方法区中的这些数据的外部接口。

(5)加载阶段以及连接阶段的部分内容是交叉进行的,加载阶段没有完成,连接阶段就可以开始。

三,验证

1.作用:为了确保Class文件的字节流中包含的信息符合虚拟机的要求,并且不会危害虚拟机自身的安全。因此验证是非常重要的。

2.验证阶段完成的四个阶段的检验动作:

文件格式验证,元数据验证,字节码验证,符号引用验证。
(1)文件格式验证:验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理。
(2)元数据验证:对类的元数据信息进行语义校验,能保证不存在不符合java语言规范的元数据信息、。
(3)字节码验证:通过数据流以及控制流分析,确定程序的语义是合法的,符合逻辑的。
(4)符号引用验证:确保解析动作能够正常执行(-Xverify:none)参数进行调优,关闭大部分的类验证措施,以缩短虚拟机的类加载时间。

明天继续

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tronhon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值