本帖最后由 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管线中的一部分。
|
|