Java 类什么时候被销毁?

在Java中,对象的生命周期是由垃圾收集器(Garbage Collector)来管理的。垃圾收集器会自动检测和回收不再被引用的对象,从而释放内存资源。类的销毁实际上就是指对象不再被引用,从而被垃圾收集器回收。

垃圾收集器的工作原理

Java的垃圾收集器通过标记-清除(Mark and Sweep)算法来实现。它首先从根对象开始,递归地遍历整个对象图,标记所有仍然被引用的对象。然后,垃圾收集器清理并释放所有未被标记的对象。这样,被标记的对象就会被保留,未被标记的对象就会被回收。

引用类型

在Java中,对象引用分为四种类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。

  • 强引用是最常见的引用类型,只要强引用存在,对象就不会被回收。
  • 软引用是一种相对强引用更弱的引用类型。当内存不足时,垃圾收集器会回收被软引用引用的对象,以释放内存。
  • 弱引用也是一种相对强引用更弱的引用类型。当垃圾收集器扫描到只有弱引用引用的对象时,该对象会被回收。
  • 虚引用是最弱的引用类型。它主要用于对象被回收时收到通知。

对象的生命周期

在Java中,对象的生命周期可以分为以下几个阶段:

  1. 创建阶段:使用关键字new创建对象,并为对象分配内存空间。

    // 创建对象
    MyClass obj = new MyClass();
    
  2. 可达性阶段:对象通过引用可被访问到。

    // 对象可达
    MyClass obj = new MyClass();
    
  3. 不可达性阶段:对象不再被引用,变得不可达。

    // 对象不再被引用
    MyClass obj = null;
    
  4. 等待回收阶段:对象进入等待回收状态,等待垃圾收集器回收。

    // 对象等待回收
    System.gc();
    
  5. 回收阶段:垃圾收集器回收不再被引用的对象,并释放内存空间。

    // 垃圾收集器回收对象
    System.gc();
    

垃圾收集器的触发

垃圾收集器的触发是由Java虚拟机自动控制的,具体触发时机和频率取决于具体的垃圾收集器和虚拟机实现。

一般来说,当满足以下条件之一时,垃圾收集器会被触发:

  • 内存不足:当系统内存不足时,垃圾收集器会被触发以回收未被引用的对象,以释放内存空间。
  • CPU空闲:当CPU处于空闲状态时,垃圾收集器会被触发以回收未被引用的对象,以提高系统的性能。

延迟和主动回收

垃圾收集器可以延迟对象的回收,即不立即回收不再被引用的对象,而是等到合适的时机再进行回收。这是为了避免频繁的垃圾收集对系统性能的影响。

Java中的垃圾收集器有两种回收方式:分代回收和全局回收。分代回收指的是根据对象的生命周期将内存划分