我知道使用静态单例(见下面的代码)经常会导致内存泄漏。
public class Singleton {
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
private Singleton() {
}
}
我不知道很多细节,但在某处我读到静态变量包含到类加载器的链接,这就是为什么它们通常不会被垃圾收集器删除。
但scala单例在字节码中转换为静态变量。那么在java Web应用程序容器中使用scala单例对象是否安全?
答案 0 :(得分:0)
像这样的静态单例(见下面的代码)经常会导致内存泄漏。
Singleton应该导致内存泄漏没有特别的原因。
我会在Java中使用
enum Singleton { INSTANCE }
和scala
object Singleton { }
我读到静态变量包含到类加载器的链接,这就是为什么它们通常不被垃圾收集器删除。
GC将清理循环引用的对象,因此没有理由这样做。每个对象,每个类都有一个指向加载它的ClassLoader的链接。
ClassLoader cl = o.getClass().getClassLoader();
如果这是一个问题,类加载器将永远不会被卸载。