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

你可能感兴趣的:(JVM类加载与类的生命周期)