垃圾回收器何时会擦除使用单例模式的对象实例?
2022-09-01 03:47:08
垃圾回收器何时会擦除使用单例模式的对象实例?
一个物体比一个普通物体停留的时间长吗?
如何在Java中手动强制删除/垃圾回收对象?
谢谢。
垃圾回收器何时会擦除使用单例模式的对象实例?
一个物体比一个普通物体停留的时间长吗?
如何在Java中手动强制删除/垃圾回收对象?
谢谢。
存在对单例的静态引用,因此在类装入器符合垃圾回收条件之前,它不符合垃圾回收的条件。
你不能强迫任何对象被垃圾回收;您可以请求垃圾回收器与 System.gc()
一起运行,但这只是一个请求。
如果你真的想让一个“单例”符合垃圾回收的条件,你可能想要一个方法将静态变量设置为null(并希望没有其他任何东西可以获取引用的副本)。显然,下次有人要求实例时,需要重新创建它......当然,在这一点上,它并不是真正的单例。
Java中有一些特殊的对象,称为GC根。它们总是可以到达的,从这些根源可以到达的对象也是如此。这些 GC 根永远不会被垃圾回收,从这些根访问的对象也是如此。在Java中,静态变量形成GC根。
Singleton 类具有对实例化的单例对象的静态引用,因此它永远不会被垃圾回收,除非 Jon Skeet 指出加载此类的上下文(类加载器)本身符合垃圾回收条件,在这种情况下,静态引用将不再是 GC 根。
我认为这是Java 1.2之前的一个错误,如果没有对它的全局引用,单例实例可以被垃圾回收,但这在Java 1.2中得到了修复,现在唯一符合垃圾回收条件的方式是如果加载这个类的类装入器被垃圾回收。