今天看了看java类的生命周期,感觉很不错。总结了下,由于水平有限,文中存在不足之处,欢迎大家批评指正。
java类的生命周期分5个阶段:
1.加载阶段
1.1加载前提:当一个类可能被使用时,JVM会加载此类。
1.2加载过程:
1.2.1找到需要的类,并把类的信息加载到JVM的方法区中。
1.2.2在堆中实例化一个java.lang.Class的对象,作为方法区中这个类的信息的入口。
2.连接阶段
连接任务:加载后的验证工作和初始化前的准备工作。即:验证、准备和解析。
2.1验证
验证类是否合法。
2.2准备
为类的static变量(包括final变量)分配内存,并设为jvm默认的初始值。
注:final变量的默认值是程序中设定的值(使用常量不会引起类的初始化)。
2.3解析
把常量池中的引用(即标识符)转换为内存地址。
3.初始化阶段
只有在直接引用一个类的时候才会将一个类初始化。
初始化工作包括:其实就是执行static变量赋值语句和执行static代码块。
4.使用阶段
对类的使用包括直接引用和被动引用。
4.1被动引用
4.1.1调用类的“static final 变量”。
4.1.2通过子类调用父类的static变量、static方法,对子类来说是被动引用。
4.1.3新建一个类数据,如String[] strs = new String[10]。
4.2直接引用
4.2.1设置或使用类的static变量、调用类的static方法(包括main方法)、实例化一个该类的对象。
4.2.2初始化子类的时候,直接引用父类。
4.2.3通过反射,Class.forName("类路径")。
当直接引用一个类时,该类没有被初始化,则会初始化该类。但若被动引用一个类时,不会触发该类的初始化。
5.卸载阶段
在JVM垃圾回收的时候若检测到类不会再被使用时,卸载该类。
注:关于Java类周期的前3个阶段的执行顺序,加载阶段和连接阶段可能交叉执行,连接阶段和初始化阶段又可能交叉执行。