java虚拟机类加载机制

类加载的概念:

    java虚拟机把描述的类的数据从Class文件加载到内存,并对数据进行校验、转化解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制。

特点:

    在java语言里面类型的加载、连接和初始化过程都在程序运行期间完成的,这种策略让类加载时增加一些性能的开销,但是却为Java应用提供了极高的扩展性和灵活性。例如:编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类,用户可以通过java预置的或自定义类加载器,让某个本地应用程序在运行从网络或者其他地方加载一个二进制流为其程序代码的一部分。

一个类从被加载到虚拟机内存中开始,到卸载出内存为止,它的生命周期将会经历 加载、验证、准备、解析、初始化、使用、卸载七个阶段,其中验证、准备、解析三个阶段统称为连接,七个阶段发生顺序如图

1.加载

加载时类加载的第一个过程,在这个阶段将完成以下三件事:

 (1)通过一个类的全限定名来获取定义此类的二进制字符流。

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

 (3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问接口。

2.验证

验证是连接阶段的第一步,这已阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚拟机范式》的全部要求,保证这些信息被当做代码运行后不会危害虚拟机自身的安全。

该阶段主要完成以下四种验证:

(1)文件格式验证验证字符流是否符合Class文件的范式,如主次版本号在当前Java虚拟机接受范围之内。常量池中是否有不被支持的类型。

(2)元数据验证:对字节码的描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。

(3)字节码验证:第三阶段是整个验证过程中最复杂的一个阶段主要目的是通过数据量分析和控制流分析,确定程序是否合法、符合逻辑的。主要针对方体的验证如:方法中的类型转换是否正确,跳转指针是否正确等。

 (4)符合引用验证:最后一个阶段的校验行为发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作将在连接的第三阶段解析中发生。

3.准备

准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在 Java 堆中。
public static int value=123;

4.解析

该阶段主要完成符号引用到直接引用的转化动作,解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。

5.初始化

初始化是类加载的最后一步,前面类加载的过程,除了在加载阶段用户应用程序可以通过自定义加载器参与之外,其余动作完全由虚拟机主导和控制,到了初始化阶段才开始执行类中定义的Java代码

6.使用

7.卸载

参考:《深入理解Java虚拟机》 周志明

身处江湖的互联网民工

posted @ 2020-05-31 22:30  回忆漫长  阅读(128)  评论(0编辑  收藏  举报