黑马程序员技术交流社区

标题: 我对类生命周期的理解 [打印本页]

作者: heshiwei    时间: 2015-10-11 13:55
标题: 我对类生命周期的理解
本帖最后由 heshiwei 于 2015-10-11 13:58 编辑

类加载
        类加载的过程分为:加载、连接、初始化
        1. 加载
                首先类加载器ClassLoader 将.class字节码文件加载到内存的数据区的方法区,然后在堆区创建和该类对应从java.lang.Class对象,
                用于封装该类的数据结构,该堆区中的Class对象直接指向方法区中的类。

                加载器分为:启动加载器、扩展加载器、系统加载器
                类加载器是jvm的一部分,由C++实现。

        2. 连接
                连接分为三个过程:验证、准备、解析

                1. 验证:在字节码加载到内存数据区方法区后,此过程将验证类是否加载正确。

                2. 准备:为类中的类变量静态变量等分配内存空间

                3. 解析:将类中的符号引用解析成直接引用

        3. 初始化
                在一个类被初始化之前必须保证它的父类已经被初始化(和子对象初始化父对象必须调用父对象的构造方法是一样的),并且该初始化是由jvm保证线程安全。
                一般每个类都有<clinit>() 来初始化静态成员。除非以下情况:
                        
                        该类既没有声明任何类变量,也没有静态初始化语句;

                        该类声明了类变量,但没有明确使用类变量初始化语句或静态初始化语句初始化;

                        该类仅包含静态 final 变量的类变量初始化语句,并且类变量初始化语句是编译时常量表达式。


类卸载
        类加载后,如果长时间不使用则需要进行卸载,卸载工作由jvm完成。
        类被卸载需要满足三个条件:
        1. 该类所有的对象已经被GC回收干净。
        2. 加载该类的ClassLoader已经被回收
        3. 该类对应的java.lang.Class对象不再被引用,并且无法通过反射的方法再次创建该类。
卸载类具体的做法是将类在方法区中的数据清除干净。

而对象的生命周期是在类的生命周期前提下产生的,如太阳和太阳黑子,再如asp.net页面生命周期只是Application管线中的一部分。
        

03223849_BJJV.jpg (42.08 KB, 下载次数: 11)

03223849_BJJV.jpg

作者: heshiwei    时间: 2015-10-11 13:56
沙发还是自家的舒服




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2