类加载【Java】

来自智得网
跳转至: 导航、​ 搜索

简介

Java中类的生命周期

Java的类加载过程是指JVM将类的源文件加载到JVM(Java虚拟机)中,可以被使用的过程。

在Class被使用之前需要经历加载、连接、初始化三个步骤,而其中连接又分为验证、准备、解析三个环节。

加载是指类加载器加载类的源文件的过程。不同类加载器有不同的加载策略,包括加载的位置、顺序等。

验证是对加载的二进制class文件验证,包括格式验证,字节码验证等。

准备阶段为类的变量分配内存空间,并且完成变量的初始化。

解析将常量池中的符号引用转换为直接引用。

初始化过程是指完成构造函数的调用。

除了类的加载过程之外,Java中类完整的生命周期还包括类的使用以及类的死亡(类的卸载过程)。

原理

加载过程

加载过程的第一步是获取类的名称关联的class的二进制流,Java语言规范并没有严格规定二进制流存储的介质,所以class文件可以从文件、数据库等存储中获取,在applet应用中通过网络获取,可以通过编译器产生,例如servlet、jsp对应的class文件,甚至可以通过字节码工具动态生成。

目前class文件通常存储在zip压缩包中,例如Jar包,War包等。

加载class的工具类称为类加载器,类加载器规定了类加载的策略,例如加载的位置以及加载的顺序等。

JVM的类加载器是存在树状的层次结构的,例如分为Boot加载器,应用加载器,这些不同的类加载器承担不同的职责。

双亲委派机制规定了类加载首先使用父类加载器进行加载,当父类加载器不能加载的时候才使用子类加载器加载,双亲委派机制即保证了核心类的唯一性,避免核心类被破坏,而且节约了内存空间,又保证各个应用空间的类的隔离性。

连接过程

连接过程第一步是验证环节,验证主要是验证以下内容:

验证文件格式,例如Class文件的开头标志,主次版本号的合法性,常量池中常量类型的合法性。

验证元数据约束,例如类的继承关系,有没有继承final修饰的类等。

字节码验证,验证字节码的数据流和控制流可以正常运行,例如操作指令和操作数相匹配。

符号引用验证,用来验证符号引用的合法性。