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类的整个生命周期就结束了。

参考链接:详解java类的生命周期_割韭韭的博客-CSDN博客_java生命周期


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!