郑州做网站好,米能花型设计师服务平台,互联网网络营销外包,做本地网站需要什么资质在Java虚拟机规范中#xff0c;把描述类的数据从class文件加载到内存#xff0c;并对数据进行校验、转换解析和初始化#xff0c;最终形成可以被虚拟机直接使用的java.lang.Class对象#xff0c;这个过程被称作类加载过程。一个类在整个虚拟机周期内会经历如下图的阶段把描述类的数据从class文件加载到内存并对数据进行校验、转换解析和初始化最终形成可以被虚拟机直接使用的java.lang.Class对象这个过程被称作类加载过程。一个类在整个虚拟机周期内会经历如下图的阶段从加载到初始化就是类加载过程。
加载阶段
这里的加载是整个类加载过程中的一个阶段不等同于类加载在加载阶段会做以下三件事
通过类的全限定名读取类的二进制流。将字节流所代表的的静态存储结构转化为方法区的运行时数据结构。在虚拟机内存的堆区中生成一个代表这个类的java.lang.Class对象用于方法区这个类的各种数据的访问入口如下图所示。 由于Java虚拟机对加载class文件的来源并未做限制所以出现了以下的class文件加载方式从本地系统中直接获取从网络中获取如Web Applet从zip压缩包中获取将zip压缩后缀改为.jar也可以直接使用动态代理生成由其他文件生成如JSP从数据库中获取加密文件中获取如Class文件加密防反编译
链接阶段
在加载阶段完成之后class文件的类信息数据就会存储在方法区同时在Java虚拟机堆区生成一个对应类的Class对象这个Class对象会在之后变成程序访问方法区中的类数据的外部接口。链接阶段并不是一定等到加载阶段完成后才开始链接的部分动作会跟随加载阶段进行如部分字节码文件格式的验证动作。
验证 验证是链接的第一个阶段这个过程中JVM会去校验class文件格式及class文件二进制流中所包含的信息是不是符合虚拟机规范的约束。包含四部分内容的验证
文件格式验证验证class文件魔数值是否为0xCAFEBABE、主次版本号、常量类型等。元数据验证对类的元数据信息进行语义校验。字节码验证通过数据流分析和控制流分析、确定程序语义是合法的、符合逻辑的。符号引用验证验证发生在解析阶段主要对常量池中的各种符号引用进行匹配性校验。
准备 在准备阶段会给类变量被static修饰的静态变量分配内存并且初始化类变量初值零值如上表就是各种类型对应的零值从概念上讲这些变量所使用的内存都应当在方法区中进行分配但是方法区本身是一个逻辑上的区域在JDK7及之前HotSpot使用永久代来实现方法区时实现是完全符合这种逻辑概念的;而在JDK8及之后类变量则会随着Class对象一起存放在Java堆中这时候类变量在方法区 就完全是一种对逻辑概念的表述; 注意final修饰的类变量常量并不会进行准备阶段进行赋初值的操作在编译的时候会给属性添加ConstantValue属性准备阶段直接完成赋值。正因为类变量拥有赋初值这一操作所以只声明类变量不进行赋值动作程序也能正常执行如下代码可以验证各种类型的初值。
public class ClassLoaderPrepare {public static int i;public static void main(String[] args) {System.out.println(i);}
}解析 解析阶段的作用是将符号引用转为直接引用。每个class文件都对应一个常量池常量池中存储了类、接口、字段、方法等各类信息符号引用是一组符号指向常量池中被引用的目标要在虚拟机中定位到目标就需要指向对应目标的内存地址这种引用就是直接引用。
初始化阶段
在链接阶段的准备阶段中已经为类变量分配了内存地址和初值在初始化阶段就会对这些类变量进行赋值操作。如果一个类含有静态变量或者静态代码块java虚拟机就会在编译为其生成一个方法类初始化方法其内容由编译期间虚拟机收集到的类变量的赋值动作和静态代码块合并而来。 注意
方法中指令的顺序是依据指令对应的语句在源文件中出现的顺序,静态代码块中只能访问定义在它之前的变量如下代码就会提示非法的前向引用。在继承关系中父类的方法先于子类执行。在多线程同时初始化一个类时只有其中一个线程能够执行
public class ClassLoaderCLInit {static {i 10;System.out.println(i);}public static int i;
}使用
销毁