1.一个Java对象有其自己的生命周期,而对象基于class类同样也有着自己生命周期。
2.java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段。
2.1.加载:java类加载器查找Class的二进制文件,把类的信息加载到jvm的方法区中,实例化一 个java.lang.Class对象。
2.2.连接:
a)验证:检查载入的class文件数据合法性,如字节码的格式等,目的就是保证加载的类是能够被jvm 所运行。
b)准备:为类的静态变量分配内存(基本类型为0,引用类型为null),为静态常量赋值目的是确保 变量的初始化。
解析:把常量池中的符号引用转换为直接引用(直接引用就是这个方法在方法区中的。内存地址;符 号引用就是一个方法名),解析就是把类、接口、方法、成员变量的符号引用转换成内存地 址,以供调用(就是指针)。
2.3.初始化:执行静态域(声明变量时赋值语句,静态块)。
引用分为直接引用和被动引用,只有直接引用,会触发这一阶段。
直接引用:new实例化对象;使用类的静态变量(非静态常量),方法;反射执行前三种情况;子 类被初始化;作为程序入口(调用main--调用静态方法的一种)。
被动引用:定义类数组;引用类的静态常量;类.class。
从上面看出,类的初始化具有惰性行为(只保证初始化要用到的),而主动引用会触发初始化(静 态常量是在链接中的准备阶段已经完成了)。
2.4.使用:这样我们就可以创建对象实例了。
2.5.卸载:Class作为JVM中的一个特殊对象,也会被GC回收卸载(清空方法区中Class的信息和堆区中的 java.lang.Class对象。这时Class的声明周期就结束了)。
被回收要同时满足以下三个条件:
:该类所有的实例都已经被GC;
NoClassLoader:加载该类的ClassLoader实例已经被GC;
:该类的java.lang.Class对象没有被引用(XXX.class, 静态变量/方法)。
由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载(根据第 二条依据,系统ClassLoader实例不会被GC,Java虚拟机本身会始终引用这些类加载器,而这 些类加载器则会始终引用它们所加载的类的Class对象,因此这些Class对象始终是可触及的)
类加载器;
类加载器;
类加载器。
Class是可以被卸载的(如tomat的jsp动态修改)。