Безопасно ли использовать scala singleton в контейнерах веб-приложений Java?

#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();
  

Если бы это было проблемой, загрузчик классов никогда бы не выгружался.