1. Java 类的生命周期 (Class Lifecycle):
类从被加载到 JVM,到最终可能被卸载,经历以下阶段:
-
加载 (Loading):
- 何时发生: 通常是首次主动使用该类时,例如创建类的实例、访问类的静态成员(非 final 常量)、调用类的静态方法、初始化子类、JVM 启动时执行包含
main()
方法的类等。 - 过程: 类加载器(ClassLoader)负责查找并读取类的
.class
文件二进制字节流,将其转化为 JVM 内部的数据结构,并在方法区(JDK 8 之后是元空间)中创建代表该类的java.lang.Class
对象。
- 何时发生: 通常是首次主动使用该类时,例如创建类的实例、访问类的静态成员(非 final 常量)、调用类的静态方法、初始化子类、JVM 启动时执行包含
-
链接 (Linking):
- 验证 (Verification): 确保
.class
文件符合 JVM 规范,没有安全问题。包括文件格式、元数据、字节码和符号引用验证。 - 准备 (Preparation): 为类的静态变量分配内存,并赋予默认初始值(例如
int
为 0,引用类型为null
)。静态常量(static final
)在此阶段会被赋予代码中指定的初始值。 - 解析 (Resolution): 将常量池中的符号引用替换为直接引用(指向实际内存地址的指针等)。
- 验证 (Verification): 确保
-
初始化 (Initialization):
- 何时发生: 在类被首次主动使用之前完成。JVM 会保证在多线程环境下,类的初始化方法
<clinit>()
只会被执行一次。 - 过程: 执行类的初始化方法
<clinit>()
。该方法由编译器收集类中所有静态变量的赋值动作和静态代码块(static {}
)中的语句按源代码顺序合并而成。父类的<clinit>()
方法会在子类的<clinit>()
方法执行之前执行。
- 何时发生: 在类被首次主动使用之前完成。JVM 会保证在多线程环境下,类的初始化方法
-
使用 (Using):
- 类被成功加载、链接和初始化后,就可以在程序中正常使用了。可以创建该类的对象实例、访问其静态成员、调用其方法等。
-
卸载 (Unloading):
- 何时发生: 当一个加载的类不再被任何存活的
java.lang.Class
对象的引用所持有,并且该类本身也没有任何存活的实例时,在满足特定条件的情况下,该类可以被卸载。 - 过程: 将类从方法区移除,回收其占用的内存。类的卸载在普通的应用程序中很少发生,通常只在动态代理、热部署等特殊场景下才可能发生。
- 何时发生: 当一个加载的类不再被任何存活的
2. Java 对象的生命周期 (Object Lifecycle):
对象从创建到被垃圾回收经历以下阶段:
- 创建 (Creation): 通过
new
关键字、反射、克隆或反序列化等方式创建对象实例,JVM 在堆内存中分配空间并进行初始化,执行构造方法。 - 使用 (Usage): 对象被程序引用和操作,访问其成员变量和方法。
- 不可见 (Invisible): 对象不再被任何存活的 GC Root 直接或间接引用,成为垃圾回收的候选对象。
- 不可触及 (Unreachable): 垃圾回收器标记不可达对象。
- 回收 (Reclamation): 垃圾回收器回收对象占用的内存。在回收前可能会执行
finalize()
方法(不推荐依赖)。
3. Java 线程的生命周期 (Thread Lifecycle):
线程从创建到终止经历以下状态:
- 新建 (New): 线程对象已创建,但
start()
方法尚未调用。 - 可运行 (Runnable): 线程可以被 JVM 调度执行(包括就绪和运行中)。
- 阻塞 (Blocked): 线程等待获取监视器锁。
- 等待 (Waiting): 线程调用
Object.wait()
等方法进入等待状态,等待其他线程唤醒。 - 计时等待 (Timed Waiting): 线程调用带有超时参数的方法进入等待状态,等待超时或被唤醒。
- 终止 (Terminated): 线程执行完毕或因异常终止。
4. Servlet 的生命周期 (Servlet Lifecycle):
Servlet 由 Servlet 容器管理:
- 加载和实例化: 容器启动或首次请求时加载 Servlet 类并创建实例。
- 初始化 (
init()
): 容器调用init()
方法进行初始化(只调用一次)。 - 处理请求 (
service()
): 容器为每个请求创建HttpServletRequest
和HttpServletResponse
对象,并调用service()
方法处理请求(多次调用)。 - 销毁 (
destroy()
): 容器关闭或卸载 Servlet 时调用destroy()
方法进行清理(只调用一次)。
5. Spring Bean 的生命周期 (Spring Bean Lifecycle):
Spring 容器管理 Bean 的创建、初始化、使用和销毁:
- 实例化 (Instantiation): Spring 容器创建 Bean 实例。
- 属性填充 (Populating Properties): 依赖注入,设置 Bean 的属性值。
- 初始化 (Initialization):
- 调用
InitializingBean
接口的afterPropertiesSet()
方法。 - 调用 XML 配置中
init-method
指定的方法或带有@PostConstruct
注解的方法。
- 调用
- 使用 (Usage): Bean 在应用程序中被使用。
- 销毁 (Destruction):
- 容器关闭时,调用
DisposableBean
接口的destroy()
方法。 - 调用 XML 配置中
destroy-method
指定的方法或带有@PreDestroy
注解的方法。
- 容器关闭时,调用