Java——类加载机制详解

一、什么是类加载

虚拟机把描述类的数据从class文件(代表类和接口,是一串二进制流)加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。

 

二、什么时候进行类加载

与那些在编译时需要进行连接工作的语言不同,在java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的。

这种策略虽然会令类加载时稍微增加一些性能开销 ,但是会为Java应用程序提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。

 

三、类加载的时机

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:

加载 ( Loading ) 、验证( Verification ) 、准备( Preparation ) 、解析( Resolution )、初始化( Initialization ) 、使用( Using ) 和卸载( Unloading ) 7个阶段。其中验证、准备、解析3个部分统称为连接( Linking ) ,这7个阶段的发生顺序如图7-1所示。

图7-1中 ,加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。

注意:说的是按部就班地“开始” ,而不是按部就班地“进行”或“完成”,强调这点是因为这些阶段通常都是互相交叉地混合式进行的,通常会在一个阶段执行的过程中调用、激活另外一个阶段。

 

1、加载

1.1、when?

Java虚拟机规范中没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。

 

1.2、作用

1.通过一个类的全限定名来获取此类的二进制字节流(没有说一定要从class文件获取)

2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

3.最后在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。

总的来说就是查找并加载类的二进制数据。 

 

注意:加载阶段与连接阶段的部分内容(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段的内容,这两个阶段开始时间仍然保持着固定的先后顺序。

 

2、验证

2.1、作用

为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

 

Java语言本身是相对安全的语言,如果中间有危险操作,编译器会拒绝编译,那为什么还不够安全?

但是前面我们说了,Class文件并不一定要求用Java源码编译而来。虚拟机如果不检查输入的的字节流,对其完全信任的话,很可能会因为载入了有害的字节流而导致系统崩溃。从执行性能的角度上讲,验证阶段的工作量在虚拟机的类加载子系统中又占了相当大的一部分。

 

2.2、动作

2.2.1、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值