概述类加载过程

加载阶段

经过一个类的全限定名获取定义此类的二进制字节流java

将这个字节流所表明的静态存储结构转化为方法去的运行时数据结构安全

在内存中生成一个表明这个类的java.lang.Class对象,做为方法区这个类的各类数据的访问入口数据结构

连接阶段

验证

目的在于确保class文件的字节流中包含的信息符合当前虚拟机的要求,保证被加载类的正确性,不会危害虚拟机自身安全。多线程

主要包括四种验证: 文件格式验证,元数据验证,字节码验证,符号引用验证线程

准备

为变量分配内存并设置该类变量的默认值,即零值,类变量会分配在方法区中。code

这里不包含用final修饰的static,由于final在编译的时候就已经分配了,准备阶段会显示初始化。对象

这里不会为实例变量分配初始化,实例变量会随着对象一块儿分配到java堆中内存

解析

将常量池的符号引用转化为直接引用的过程编译器

事实上,解析操做每每会伴随着JVM在执行完初始化以后再执行同步

初始化阶段

初始化阶段就是执行类构造器方法<clinit>()的过程

此方法不须要定义,是javac编译器自动收集类中的全部类变量的赋值动做静态代码块中的语句合并而来。

<clinit>()不一样于类的构造器。( 构造器是虚拟机视角下的<init>() )

若该类具备父类,JVM会保证自雷的<clinit>() 执行前,父类的<clinit>() 已经执行完毕

虚拟机必须保证一个类 的<clinit>() 方法在多线程下被同步加锁

参考资料: 《深刻理解java虚拟机 第三版》 周志明

相关文章
相关标签/搜索