虚拟机把描述类的数据从Class文件加载到内存,并为之创建一个java.lang.Class对象,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。也就是说程序使用任何类时,系统都会为之建立一个java.lang.Class对象。
2.类的生命周期类的生命周期包括这5个部分,加载、连接、初始化、使用和卸载,其中前三部是类的加载的过程,如下图;
- 加载(Loading):java文件加载成 Class 文件,在堆中创建一个java.lang.Class类的对象
- 连接
- 验证(Verification):确保加载的class文件符合JVM规范(验证格式、依赖元数据、字节码、符号引用验证)
- 准备(Preparation):为静态变量,分配内存空间并设置初始值
- 解析(Resolution):JVM常量池中的符号引用(常量名)替换为直接引用(地址引用)
- 初始化(Initialization):构造器、静态变量赋值、静态代码块
- 当初始化一个类时,如果发现其父类没有进行初始化,则先对其父类继续出初始化。
- 使用(Using): new出的对象程序中使用
- 卸载(Unloading) : 执行垃圾回收
其中,解析这步骤的顺序是不确定的,当存在动态绑定情况时(如重写和实现接口),解析出现在程序的运行期,而静态绑定相关的解析存在程序的编译期。
3.类加载的时机- 创建类的实例new一个对象时 ;
- 访问类的静态变量(被final修饰、已在编译期把结果放入常量池的静态字段除外) ;
- 访问类的静态方法 ;
- 反射获取类 (Class.forName("my.xyz.Test")) ;
- 当初始化一个类时,若其父类还未初始化,则先触发父类的初始化 ;
- 虚拟机启动时,定义了main()方法的那个类先初始化 ;
- 主动引用:上面这些种行为称为对一个类的的主动引用,会触发类的初始化
- 被动引用:除上面五种主动引用之外,其他引用类的方式都不会触发类的初始化,称为类的被动引用
- 程序正常执行结束
- 程序在执行过程中遇到了异常或错误而异常终止
- 由于操作系统出现错误而导致Java虚拟机进程终止
- 执行了 System.exit()方法



