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