https://juejin.cn/post/7325069743143157801

在Java中,单例实例通常是不会被垃圾回收器(GC)回收的,主要原因是单例模式的设计意图是在程序的整个生命周期内保持只有一个实例。

具体来说,单例的一个实例被私有静态成员变量所引用。在 Java 中,静态成员变量属于类级别的,它们的生命周期和类的加载、卸载一致。只要类没有被卸载,这些静态成员变量就会一直保持在内存中,也就不会成为垃圾回收器的回收目标。

下面是一个单例实现的例子:


public class MySingleton {
    private static MySingleton instance = new MySingleton();

    private MySingleton() {
        // 私有构造函数
    }

    public static MySingleton getInstance() {
        return instance;
    }

    // 其他方法...
}

在这个例子中,只要MySingleton类没有被卸载,instance因为被getInstance()方法静态引用,所以它不会被GC回收。

在一些特定的情况下,单例可以被回收,例如:

  1. 类卸载:如果一个类加载器被回收,那么由这个类加载器加载的类以及类的静态变量都会被 GC 回收。这在 JavaEE 环境或者热部署的场景中可能会发生。
  2. 单例实现方式:如果单例是通过实例的弱引用实现的,这种特殊情况下,当 JVM 感觉到内存紧张时,这个单例实例是可以被 GC 回收的。

尽管单例实例通常不会被 GC 回收,但是也应当注意资源管理和程序设计,以防止内存泄漏或者无法预料的单例状态。

Spring容器中的Bean是否会被GC呢?