java关于Class的生命周期_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java关于Class的生命周期

java关于Class的生命周期

 2016/8/29 5:31:40  javazqd110  程序员俱乐部  我要评论(0)
  • 摘要:1.一个Java对象有其自己的生命周期,而对象基于class类同样也有着自己生命周期。2.java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段。2.1.加载:java类加载器查找Class的二进制文件,把类的信息加载到jvm的方法区中,实例化一个java.lang.Class对象。2.2.连接:a)验证:检查载入的class文件数据合法性,如字节码的格式等,目的就是保证加载的类是能够被jvm所运行。b)准备:为类的静态变量分配内存(基本类型为0,引用类型为null)
  • 标签:Java class

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实例不会被GCJava虚拟机本身会始终引用这些类加载器,而这 ? ? ? ? ?些类加载器则会始终引用它们所加载的类的Class象,因此这些Class对象始终是可触及的)

? ? ? ?Bootstrap类加载器;

? ? ? ?Extension类加载器;

? ? ? ?System类加载器。

? ? ? ?自定义的类加载器加载的Class是可以被卸载的(tomatjsp动态修改)

?

?

发表评论
用户名: 匿名