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动态修改)。