#java #scala #singleton
#java #scala #синглтон
Вопрос:
Я знаю, что использование статического синглтона, подобного этому (см. Код Ниже), часто приводит к утечке памяти.
public class Singleton {
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
private Singleton() {
}
}
Я не знаю многих деталей, но где-то я читал, что статические переменные содержат ссылку на classloader, и именно поэтому они часто не удаляются сборщиком мусора.
Но scala singleton преобразуются в статические переменные в байт-коде. Так безопасно ли использовать объекты scala singleton в контейнере веб-приложений Java?
Ответ №1:
подобный статический синглтон (см. Код Ниже) часто приводит к утечке памяти.
Нет особой причины, по которой синглтон должен приводить к утечке памяти.
Я бы использовал в Java
enum Singleton { INSTANCE }
и в scala
object Singleton { }
Я читал, что статические переменные содержат ссылку на classloader, и именно поэтому они часто не удаляются сборщиком мусора.
GC очистит объекты с круговыми ссылками, поэтому для этого нет причин. Каждый объект, каждый класс имеет ссылку на загрузчик классов, который его загрузил.
ClassLoader cl = o.getClass().getClassLoader();
Если бы это было проблемой, загрузчик классов никогда бы не выгружался.