垃圾收集器何时擦除使用Singleton模式的对象的实例?

垃圾收集器何时擦除使用Singleton模式的对象的实例?

对象是否比常规对象更长时间?

如何在Java中手动强制删除/垃圾回收?

谢谢。

有一个单例的静态引用,因此在类加载器符合垃圾收集条件之前,它不符合垃圾收集的条件。

你不能强迫任何对象被垃圾收集; 您可以请求垃圾收集器与System.gc()一起运行,但它只是一个请求。

如果你真的想让一个“单例”符合垃圾收集的条件,你可能想要一个方法将静态变量设置为null(并希望没有别的东西带有引用的副本)。 显然,下次有人要求一个实例,它需要重新创建……当然,它不是真正的单身人士。

如果你在单例类中保持对它的静态引用,那么引用计数不能降为0,因此不应该收集它。

Java中有一些名为GC根的特殊对象。 它们总是可以到达的,从这些根可以到达的对象也是如此。 这些GC根源永远不会被垃圾收集,因此从这些根可以访问的对象也是如此。 在Java中,静态变量形成GC根。

Singleton类具有对实例化的单例对象的静态引用,因此它永远不会被垃圾收集,除非Jon Skeet声明加载此类(类加载器)的上下文本身有资格进行垃圾收集,在这种情况下静态引用将不再是GC根。

相关答案在这里 。

我认为这是Java 1.2之前的一个错误,当单例实例可能被垃圾收集时,如果没有全局引用它但是已经在Java 1.2中修复了,现在只有加载类加载器才有资格进行垃圾收集这个class是垃圾收集。

static字段可以并且确实得到GCed但是这不会在简单的应用程序中发生。

静态字段由Class引用,Class由ClassLoader引用。 ClassLoader由每个类和该类的每个实例引用。

但是在OSGi容器和应用程序服务器中,删除对应用程序或库的每个引用以及它的类加载器并不罕见。 此时,类加载器和每个静态字段都可以进行GC编辑。