Java 类与生命周期
本文最后更新于:2022年7月20日 晚上
概览:Java类与生命周期
预警!仅用于本人快速自学,不过欢迎指正。
类的生命周期
指一个class文件从加载到卸载的全过程。
1加载
找到需要加载的类并把类的信息加载到方法区中,然后在堆中实例化一个Class对象,作为方法区中这个类的信息的入口。
!注意:加载和链接并不是先后执行的,而是交叉执行的。但是这两个阶段总的开始时间和完成时间总是固定的:加载阶段总是在连接阶段之前开始,连接阶段总是在加载阶段完成之后完成。
2链接
2.1验证
验证字节码是否合法
2.2准备
为类的静态变量分配内存并设置为默认值。而对于非静态变量则不会分配内存。
而如果有final修饰的值并且程序中给了常量,基本数据类型和string类型会直接赋值,其他引用类型还需要在初始化阶段赋值。
2.3解析
把常量池中的符号引用转换为直接引用。
3初始化 cinit()
如果一个类被直接引用,就会触发类的初始化。在java中,直接引用的情况有:
- 通过new关键字实例化对象、读取或设置类的静态变量、调用类的静态方法。
- 通过反射方式执行以上三种行为。
- 初始化子类的时候,会触发父类的初始化。
- 作为程序入口直接运行时(也就是直接调用main方法)
类的初始化过程是这样的:按照顺序自上而下运行类中的变量赋值语句和静态语句,如果有父类,则首先按照顺序运行父类中的变量赋值语句和静态语句。
在类的初始化阶段,只会初始化与类相关的静态赋值语句和静态语句,也就是有static关键字修饰的信息,而没有static修饰的赋值语句和执行语句在实例化对象的时候才会运行。
4使用
5卸载
在类使用完之后,如果满足下面的情况,类就会被卸载:
- 该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
- 加载该类的ClassLoader已经被回收。
- 该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!