类的生命周期

一、生命周期


 

 

加载 连接 初始化 只是启动顺序,启动后可能交叉执行。

 

二、加载


加载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的时候自动回收

 

posted @ 2020-06-28 20:46  蓝天随笔  阅读(292)  评论(0编辑  收藏  举报