Java 类什么时候被销毁?
在Java中,对象的生命周期是由垃圾收集器(Garbage Collector)来管理的。垃圾收集器会自动检测和回收不再被引用的对象,从而释放内存资源。类的销毁实际上就是指对象不再被引用,从而被垃圾收集器回收。
垃圾收集器的工作原理
Java的垃圾收集器通过标记-清除(Mark and Sweep)算法来实现。它首先从根对象开始,递归地遍历整个对象图,标记所有仍然被引用的对象。然后,垃圾收集器清理并释放所有未被标记的对象。这样,被标记的对象就会被保留,未被标记的对象就会被回收。
引用类型
在Java中,对象引用分为四种类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。
- 强引用是最常见的引用类型,只要强引用存在,对象就不会被回收。
- 软引用是一种相对强引用更弱的引用类型。当内存不足时,垃圾收集器会回收被软引用引用的对象,以释放内存。
- 弱引用也是一种相对强引用更弱的引用类型。当垃圾收集器扫描到只有弱引用引用的对象时,该对象会被回收。
- 虚引用是最弱的引用类型。它主要用于对象被回收时收到通知。
对象的生命周期
在Java中,对象的生命周期可以分为以下几个阶段:
-
创建阶段:使用关键字
new
创建对象,并为对象分配内存空间。// 创建对象 MyClass obj = new MyClass();
-
可达性阶段:对象通过引用可被访问到。
// 对象可达 MyClass obj = new MyClass();
-
不可达性阶段:对象不再被引用,变得不可达。
// 对象不再被引用 MyClass obj = null;
-
等待回收阶段:对象进入等待回收状态,等待垃圾收集器回收。
// 对象等待回收 System.gc();
-
回收阶段:垃圾收集器回收不再被引用的对象,并释放内存空间。
// 垃圾收集器回收对象 System.gc();
垃圾收集器的触发
垃圾收集器的触发是由Java虚拟机自动控制的,具体触发时机和频率取决于具体的垃圾收集器和虚拟机实现。
一般来说,当满足以下条件之一时,垃圾收集器会被触发:
- 内存不足:当系统内存不足时,垃圾收集器会被触发以回收未被引用的对象,以释放内存空间。
- CPU空闲:当CPU处于空闲状态时,垃圾收集器会被触发以回收未被引用的对象,以提高系统的性能。
延迟和主动回收
垃圾收集器可以延迟对象的回收,即不立即回收不再被引用的对象,而是等到合适的时机再进行回收。这是为了避免频繁的垃圾收集对系统性能的影响。
Java中的垃圾收集器有两种回收方式:分代回收和全局回收。分代回收指的是根据对象的生命周期将内存划分