java类的加载过程

来源:互联网 发布:mac怎么导入照片 编辑:程序博客网 时间:2024/06/05 07:20

要想了解java类的加载过程,就得熟悉JVM的内存布局,只有清楚了java的内存布局,才能更深刻的理解类的加载过程。如下图,java的内存布局:
这里写图片描述
这里写图片描述

概述

Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。
java虚拟机的类加载机制: 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

工作机制

类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤:
(1) 装载:查找和导入Class文件;
(2) 链接:把类的二进制数据合并到JRE中;
(a)校验:检查载入Class文件数据的正确性;
(b)准备:给类的静态变量分配存储空间;
(c)解析:将符号引用转成直接引用;
(3) 初始化:对类的静态变量,静态代码块执行初始化操作
Java程序的动态扩展是由运行期动态加载和动态链接实现的;

  1. 加载
    ①通过一个类的全限定名来获取定义此类的二进制字节流。
    ②将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
    ③在java堆中生成一个代表这个类的Class对象,作为访问方法区中这些数据的入口。
  2. 链接
    (1)校验
    验证阶段用于确保类或接口的二进制表示结构上是正确的。验证过程可能会导致某些额外的类和接口被加载进来,但不应该会导致它们也需要验证或准备。
    (2)准备
    准备阶段的任务是为类或接口的静态字段分配空间,并用默认值初始化这些字段。这个阶段不会执行任何的虚拟机字节码指令。在初始化阶段会有显式的初始化器来初始化这些静态字段,所以准备阶段不做这些事情。
    (3)解析
    解析是根据运行时常量池的符号引用来动态决定具体的值的过程。
  3. 初始化
    初始化是类加载机制的最后一步,前面的类加载过程,除了加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。这个时候才正真开始执行类中定义的JAVA程序代码。
    初始化的步骤
    (1)如果该类还没有加载和连接,则程序先加载该类并连接。
    (2)如果该类的直接父类没有加载,则先初始化其直接父类。
    (3)如果类中有初始化语句,则系统依次执行这些初始化语句。
    用final修饰某个类变量时,它的值在编译时就已经确定好放入常量池了,所以在访问该类变量时,等于直接从常量池中获取,并没有初始化该类。
0 0
原创粉丝点击