java关于Class的生命周期

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值