A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© heshiwei 高级黑马   /  2015-10-11 13:55  /  503 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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, 下载次数: 10)

03223849_BJJV.jpg

点评

感谢大神分享! 写得太棒了! 我以前就不理解类什么时候消失的,看完后茅塞顿开啊!  发表于 2015-10-11 17:02

评分

参与人数 1黑马币 +2 收起 理由
maxwell247 + 2 赞一个!

查看全部评分

2 个回复

倒序浏览
沙发还是自家的舒服
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马