Java 中类、对象、线程、Servlet 和 Spring Bean 的生命周期

1. Java 类的生命周期 (Class Lifecycle):

类从被加载到 JVM,到最终可能被卸载,经历以下阶段:

  • 加载 (Loading):

    • 何时发生: 通常是首次主动使用该类时,例如创建类的实例、访问类的静态成员(非 final 常量)、调用类的静态方法、初始化子类、JVM 启动时执行包含 main() 方法的类等。
    • 过程: 类加载器(ClassLoader)负责查找并读取类的 .class 文件二进制字节流,将其转化为 JVM 内部的数据结构,并在方法区(JDK 8 之后是元空间)中创建代表该类的 java.lang.Class 对象。
  • 链接 (Linking):

    • 验证 (Verification): 确保 .class 文件符合 JVM 规范,没有安全问题。包括文件格式、元数据、字节码和符号引用验证。
    • 准备 (Preparation): 为类的静态变量分配内存,并赋予默认初始值(例如 int 为 0,引用类型为 null)。静态常量(static final)在此阶段会被赋予代码中指定的初始值。
    • 解析 (Resolution): 将常量池中的符号引用替换为直接引用(指向实际内存地址的指针等)。
  • 初始化 (Initialization):

    • 何时发生: 在类被首次主动使用之前完成。JVM 会保证在多线程环境下,类的初始化方法 <clinit>() 只会被执行一次。
    • 过程: 执行类的初始化方法 <clinit>()。该方法由编译器收集类中所有静态变量的赋值动作和静态代码块(static {})中的语句按源代码顺序合并而成。父类的 <clinit>() 方法会在子类的 <clinit>() 方法执行之前执行。
  • 使用 (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()): 容器为每个请求创建 HttpServletRequestHttpServletResponse 对象,并调用 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 注解的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值