一、生命周期
加载 连接 初始化 只是启动顺序,启动后可能交叉执行。
二、加载
加载class文件,class文件是JVM的规范,跟java没有强依赖。
可能来源:class文件、网络传输等
加载后会在堆中生成Class对象。
三、验证
验证字节码的格式、规范等,如class文件必然4个字节的魔数0xCAFEBABE开头
四、准备
为静态属性分配内存,初始化为默认值(并非代码中赋予的值),如int类型默认值为0 引用类型默认值:null
常量如果是String字面量,会直接在堆中的String常量池分配内存,并赋予指定的值。
五、解析
Class文件常量池中对类 接口 属性 方法的符号引用 转换为实际的 指针引用
六、初始化
何时初始化
1、调用new创建实际
2、调用类的静态变量或静态方法
3、反射
4、Main方法初始化
5、初始化子类时自动初始化父类
6、调用Class.forName方法(ClassLoad的loadClass不会初始化)
何时不初始化
1、通过类调用String常量,此时直接访问String常量池
2、通过子类调用父类的静态字段或方法,父类初始化,子类不会初始化(归属谁,谁进行初始化)
3、定义数组引用某个类时。
七、卸载
class卸载是由JVM控制的
哪些类可以卸载:只有自定义ClassLoad加载的类才可以卸载
何时卸载:
1、没有对应class的实例
2、class对应的ClassLoad没有根引用(意味着可以回收)
3、Class对象没有在使用
这样JVM会在GC的时候自动回收
原文:https://www.cnblogs.com/yangfei629/p/13204963.html