JVM类加载与类的生命周期
一.JAVA虚拟机加载Class的过程
1.类加载器
JAVA中类由类加载器(ClassLoader)和它的子类来实现装载,而类加载器(ClassLoader)是一个重要的运行系统组件,它负责在运行时查找和装入类文件中的类。类加载器与JAVA虚拟机之间的传递是通过字节码传递。
2.类的生命周期
Java类从加载到虚拟机内存中到从虚拟机中卸载,它的整个生命周期包括:
(1)加载
将编译后的class文件加载到内存中,然后创建与加载class对应的类对象。此时Class对象还是不完整,所以此时的类还不可用。
(2)连接
这一阶段是主要对Class对象进行验证 , 准备 , 解析。准备主要为静态变量分配内存并设置默认的初始值,而解析主要是将符号引用替换为直接引用。
-
验证阶段:主要是检测当前的代码是否可以被jvm正常执行。包括以下验证:
- 1.类文件的结构检查:检测CLASS文件是否符合了Class的固定结构。
- 2.语义检查:检测Class的语法是否存在错误
- 3.字节码验证:验证内容主要包括以下:
- (1) 变量要在使用之前进行初始化
- (2)方法调用与对象引用类型间要匹配
- (3)访问私有数据和方法的规则没有被违反
- (4)对本地变量的访问都落在运行时堆栈内
- (5)运行时堆栈没有溢出
- (6)校验器总是在防范被故意篡改的类文件, 而不仅仅只是检查编译器产生的类文件
-
准备阶段:主要进行内存的分配,并且对静态变量赋默认值。如下代码,准备阶段会对intVariable分配4个字节的存储空间并且赋默认值0.对longVariable分配8个字节的存储空间并且赋默认值0.
public class PreparatoryPhase {
private static int intVariable = 1;
private static long longVariable;
}
(3)初始化
初始化阶段主要对类进行初始化包括:
1) 加载类的实例
2) 加载类的静态方法
3) 加载类的静态变量
4)实例化一个对象
2)父类初始化,如果类存在直接的父类并且这个类还没有被初始化,先初始化父类;
3)如果类中存在初始化语句,就依次执行这些初始化语句。
(4)卸载
当类的Class对象不再被引用时,Class对象就会结束生命周期,Class类在方法区内的数据也会被卸载,从而结束Class类的生命周期。
我们开分清楚:Class\Class对象\Class的实例
Class代表的是我们编译后的Class文件,JVM加载的Class文件。而Class对象则是通过JVM加载过程后,
Reference:
http://blog.csdn.net/xupeng874395012/article/details/76424425
http://blog.csdn.net/PacosonSWJTU/article/details/50707346