Java类的生命周期指的是从类被加载到JVM开始,直到被卸载的整个过程。这个周期大致可以分为以下几个阶段:
1. **加载(Loading)**:
- 类的二进制数据被JVM的类加载器加载。
2. **验证(Verification)**:
- 验证加载的类信息是否符合JVM规范。
3. **准备(Preparation)**:
- 为类分配静态变量的内存,并初始化静态变量的默认值。
4. **解析(Resolution)**:
- 将类的二进制数据中的符号引用转换为直接引用。
5. **初始化(Initialization)**:
- 执行类构造器`<clinit>()`方法,进行静态变量的赋值和静态代码块的执行。
6. **使用(Using)**:
- 类被加载后,可以被应用程序创建实例,或反射等方式使用。
7. **卸载(Unloading)**:
- 类在没有引用指向它,且满足垃圾回收条件时,将被卸载。卸载前的阶段,JVM会调用该类的垃圾收集器的卸载钩子(如果有的话)。
类加载过程是Java生命周期的一部分,但不是全部。以下是类生命周期中涉及的类加载器和垃圾回收器:
- **类加载器(ClassLoader)**:
- 负责加载类,可以是系统提供的类加载器,也可以是用户自定义的类加载器。
- **垃圾回收器(Garbage Collector, GC)**:
- 负责卸载不再使用的类。一个类在没有静态或非静态的引用时,可能会被垃圾回收器卸载。
类卸载的条件通常包括:
- 该类的实例已经被GC回收。
- 该类没有在其他地方被引用。
- 如果有类卸载钩子,需要执行完毕。
值得注意的是,并非所有JVM都支持类卸载,某些JVM可能出于性能或其他原因,选择不卸载任何类。此外,即使类被卸载,其静态变量的值也会丢失,因为静态变量存储在JVM的方法区(或元空间)中,而方法区不属于堆内存,不受垃圾回收器管理。
总的来说,Java类的生命周期包括加载、验证、准备、解析、初始化、使用和卸载等阶段,涉及类加载器和垃圾回收器的协同工作。